numpy - 根据行号更改 2d numpy 数组中行的每个第 n 个元素

标签 numpy vectorization

我有一个二维数组:

H = 12
a = np.ones([H, H])
print(a.astype(int))

[[1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1 1 1]]

目标是,对于每一行 r,将该行的每个 r+1(从第 0 个开始)元素替换为 0。 即,对于第 0 行,将每个“第一个”(即所有)元素替换为 0。对于第一行,将每个第二个元素替换为 0。依此类推。

它可以在循环中轻松完成(打印的数组是所需的输出):

for i in np.arange(H):
    a[i, ::i+1] = 0

print(a.astype(int))

[[0 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 1 0 1 0 1 0 1 0 1]
 [0 1 1 0 1 1 0 1 1 0 1 1]
 [0 1 1 1 0 1 1 1 0 1 1 1]
 [0 1 1 1 1 0 1 1 1 1 0 1]
 [0 1 1 1 1 1 0 1 1 1 1 1]
 [0 1 1 1 1 1 1 0 1 1 1 1]
 [0 1 1 1 1 1 1 1 0 1 1 1]
 [0 1 1 1 1 1 1 1 1 0 1 1]
 [0 1 1 1 1 1 1 1 1 1 0 1]
 [0 1 1 1 1 1 1 1 1 1 1 0]
 [0 1 1 1 1 1 1 1 1 1 1 1]]

我可以在这里利用 numpy 的矢量化功能并避免循环吗?还是不可能?

最佳答案

您可以使用np.arange并对其自身广播modulo

import numpy as np

H = 12

a = np.arange(H)
((a % (a+1)[:, None]) != 0).astype('int')

输出

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1],
       [0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
       [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
       [0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1],
       [0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1],
       [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

关于numpy - 根据行号更改 2d numpy 数组中行的每个第 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71157390/

相关文章:

python - 使用 numpy 对周期信号的单个周期进行平均

python - 获取 numpy 数组中 N 个最大值的索引,并随机打破平局

r - 向量化包含循环和 if 子句的搜索函数

optimization - 有效使用英特尔编译器 SVML `__m128 _mm_sincos_ps ()`

r - "cumulative"回归向量化

python - f2py,将 Python 函数传递给 Fortran 时出现问题

python - numpy 维度

python - 使用插值标准化 Pandas 中的时间序列

python - Pandas 矢量化操作不适用于大型数据集

python - Numpy.where() 在其条件中包含一个数组