如何使用if条件在1D和2D numpy数组之间进行向量化计算

帮派

我有一个使用1D和2D numpy数组的计算。它有两个级别的if-condition。我能够np.where避免使用一种if陈述,并进一步使用慢速列表理解来遍历每一行。

理想情况下,我想将整个计算过程向量化。可能吗?

这是我的代码:

import numpy as np

r_base = np.linspace(0, 4, 5)
np.random.seed(0)
r_mat = np.array([r_base * np.random.uniform(0.9, 1.1, 5),
                  r_base * np.random.uniform(0.9, 1.1, 5),
                  r_base * np.random.uniform(0.9, 1.1, 5)])

a_array = np.linspace(1, 3, 3)

def func_vetorized_level1(r_row, a):
    if r_row.mean() > 2:
        result = np.where((r_row >= a), r_row - a, np.nan)
    else:
        result = np.where((r_row >= a), r_row + a, 0)
    return result
# try to broadcast this func to every row of r_mat using list comprehension
res_mat = np.array([func_vetorized_level1(this_r_row, this_a) 
                    for this_r_row, this_a in zip(r_mat, a_array)])

结果是

res_mat =
array([[       nan, 0.04303787, 1.04110535, 2.02692991, 2.93892384],
       [       nan,        nan, 0.1567092 , 1.27819766, 1.90675322],
       [0.        , 0.        , 0.        , 6.25535798, 6.65682885]])
疯狂物理学家

您的代码比您想象的更可矢量化。除了对其进行矢量化处理外,您还可以更适当地使用现有功能。

要生成整数范围,其np.arange效果优于np.linspace

r_base = np.arange(5.)
a_array = np.arange(1., 4.)

随机数可以在一个单次调用中乘以一个乘法:

np.random.seed(0)
r_mat = r_base * np.random.uniform(0.9, 1.1, (3, 5))

我认为最简单的方法是制作一个输出数组,并根据不同的条件填充它:

out = np.empty_like(r_mat)

将其设置a_array为与以下行数匹配的列将很有帮助r_mat

a = a_array[:, None]

接下来的事情就是为这些情况制作面具。第一个是的行掩码r_row.mean() > 2第二个是元素方面的r_row >= a条件:

row_mask = (r_mat.mean(axis=1) > 2)[:, None]
elem_mask = r_mat >= a

该指数[:, None]row_mask使得它成为了广播目的的列向量。现在,您可以使用直接掩码和where相应的ufuncs来评估选择

np.subtract(r_mat, a, out=out, where=row_mask & elem_mask)
np.add(r_mat, a, out=out, where=~row_mask & elem_mask)
out[row_mask & ~elem_mask] = np.nan
out[~row_mask & ~elem_mask] = 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要使用循环对函数进行向量化(用向量中的值替换NA行)

来自分类Dev

如何在SAS / IML中进行向量化?

来自分类Dev

是否可以对包含1D和2D numpy数组的Python代码进行矢量化处理?

来自分类Dev

使用Numpy或Pandas对字符计数的字符串进行向量化拆分

来自分类Dev

如何使用numpy从两个1D数组生成布尔2D数组

来自分类Dev

numpy 2d和1d加法平

来自分类Dev

如何对参数为numpy中的向量的函数进行向量化

来自分类Dev

使用边界条件浏览映射到1D的2D数组

来自分类Dev

在2D数组上向量化NumPy三乘积

来自分类Dev

使用可变数组索引进行向量化

来自分类Dev

展平2D数组1D和

来自分类Dev

如何向量化2D数组和另一个向量之间的运算?

来自分类Dev

R如何在多个条件下对向量进行向量化

来自分类Dev

如何对1d和2d数组强制使用2d形状

来自分类Dev

2D ID数组和1D权重的加权numpy bincount

来自分类Dev

使用1D X,Y和Z变量在python中进行2D等高线图

来自分类Dev

如何在1D数组上使用函数创建2D Numpy数组?

来自分类Dev

如何使用1d数组中的值填充2d数组?

来自分类Dev

使用Python中的列表列表进行向量化

来自分类Dev

如何基于包含初始索引和最终索引的2个1D数组对2D numpy数组进行切片

来自分类Dev

使用pandas / numpy对左连接进行向量化

来自分类Dev

使用步骤迭代1D数组和2D数组

来自分类Dev

将php json_decode与1d和2d数组一起使用

来自分类Dev

如何对行向量和列向量进行计算以获得矩阵

来自分类Dev

用1D numpy数组制作2D

来自分类Dev

如何对参数为numpy中的向量的函数进行向量化

来自分类Dev

在2D数组上向量化NumPy三乘积

来自分类Dev

numpy:将索引的2D数组转换为1D数组以进行交集计算

来自分类Dev

如何覆盖 numpy 数组中的行向量?

Related 相关文章

  1. 1

    需要使用循环对函数进行向量化(用向量中的值替换NA行)

  2. 2

    如何在SAS / IML中进行向量化?

  3. 3

    是否可以对包含1D和2D numpy数组的Python代码进行矢量化处理?

  4. 4

    使用Numpy或Pandas对字符计数的字符串进行向量化拆分

  5. 5

    如何使用numpy从两个1D数组生成布尔2D数组

  6. 6

    numpy 2d和1d加法平

  7. 7

    如何对参数为numpy中的向量的函数进行向量化

  8. 8

    使用边界条件浏览映射到1D的2D数组

  9. 9

    在2D数组上向量化NumPy三乘积

  10. 10

    使用可变数组索引进行向量化

  11. 11

    展平2D数组1D和

  12. 12

    如何向量化2D数组和另一个向量之间的运算?

  13. 13

    R如何在多个条件下对向量进行向量化

  14. 14

    如何对1d和2d数组强制使用2d形状

  15. 15

    2D ID数组和1D权重的加权numpy bincount

  16. 16

    使用1D X,Y和Z变量在python中进行2D等高线图

  17. 17

    如何在1D数组上使用函数创建2D Numpy数组?

  18. 18

    如何使用1d数组中的值填充2d数组?

  19. 19

    使用Python中的列表列表进行向量化

  20. 20

    如何基于包含初始索引和最终索引的2个1D数组对2D numpy数组进行切片

  21. 21

    使用pandas / numpy对左连接进行向量化

  22. 22

    使用步骤迭代1D数组和2D数组

  23. 23

    将php json_decode与1d和2d数组一起使用

  24. 24

    如何对行向量和列向量进行计算以获得矩阵

  25. 25

    用1D numpy数组制作2D

  26. 26

    如何对参数为numpy中的向量的函数进行向量化

  27. 27

    在2D数组上向量化NumPy三乘积

  28. 28

    numpy:将索引的2D数组转换为1D数组以进行交集计算

  29. 29

    如何覆盖 numpy 数组中的行向量?

热门标签

归档