有没有办法用它的索引替换numpy数组中的元素
Is there way to replace an element in a numpy array with its index
假设我有以下 numpy 数组
a = np.array(([4,5,6],[8,5,4]))
Out[15]:
array([[4, 5, 6],
[8, 5, 4]])
问题:有没有pythonic的方法可以有条件地用索引值中的数字替换数组中的元素?例如,我如何用它们的行号替换所有偶数?我可以使用一个仅包含行号的单独数组来相当笨拙地完成此操作,如下所示。
b = np.arange(a.shape[0])
c = np.stack([b] * a.shape[1])
rownum = c.T
# I think that maybe rownum can be replaced by broadcasting b? but I can't get it to work.
a[a % 2 == 0] = rownum[a % 2 == 0]
我想知道是否有更多 direct/pythonic 方法来完成此任务。
您可以使用 numpy.where
:
w = np.where(a%2 == 0) #(array([0, 0, 1, 1]), array([0, 2, 0, 2]))
a[w] = w[0]
它 returns 条件为 True
的索引由轴分隔,在本例中为行和列。
一个非常相似的方法是使用 numpy.nonzero
:
w = np.nonzero(a%2 == 0)
a[w] = w[0]
注意:根据文档,在这种情况下,nonzero
应该优先于 where
。
使用以下代码:
a = np.where(a % 2 == 0, np.fromfunction(lambda r,c: r, a.shape, dtype=a.dtype),
a)
步骤:
np.fromfunction(...)
- 包含要替换的值的数组。
a
- 原始值。
a % 2 == 0
- 选择标准 - 从哪个源数组取值
对于当前元素。
结果是:
array([[0, 5, 0],
[1, 5, 1]])
假设我有以下 numpy 数组
a = np.array(([4,5,6],[8,5,4]))
Out[15]:
array([[4, 5, 6],
[8, 5, 4]])
问题:有没有pythonic的方法可以有条件地用索引值中的数字替换数组中的元素?例如,我如何用它们的行号替换所有偶数?我可以使用一个仅包含行号的单独数组来相当笨拙地完成此操作,如下所示。
b = np.arange(a.shape[0])
c = np.stack([b] * a.shape[1])
rownum = c.T
# I think that maybe rownum can be replaced by broadcasting b? but I can't get it to work.
a[a % 2 == 0] = rownum[a % 2 == 0]
我想知道是否有更多 direct/pythonic 方法来完成此任务。
您可以使用 numpy.where
:
w = np.where(a%2 == 0) #(array([0, 0, 1, 1]), array([0, 2, 0, 2]))
a[w] = w[0]
它 returns 条件为 True
的索引由轴分隔,在本例中为行和列。
一个非常相似的方法是使用 numpy.nonzero
:
w = np.nonzero(a%2 == 0)
a[w] = w[0]
注意:根据文档,在这种情况下,nonzero
应该优先于 where
。
使用以下代码:
a = np.where(a % 2 == 0, np.fromfunction(lambda r,c: r, a.shape, dtype=a.dtype),
a)
步骤:
np.fromfunction(...)
- 包含要替换的值的数组。a
- 原始值。a % 2 == 0
- 选择标准 - 从哪个源数组取值 对于当前元素。
结果是:
array([[0, 5, 0],
[1, 5, 1]])