如何在没有循环的情况下在特定位置修改2D numpy数组?

时间:2011-10-13 22:59:11

标签: python numpy

我有一个2D numpy数组,我有一个行和列的数组,应该设置为一个特定的值。让我们考虑以下示例

 a = array([[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]])

我想修改行[0,2]和列[1,2]的条目。这应该导致以下数组

 a = array([[1, 2, 0],
           [4, 5, 0],
           [7, 8, 9]])

我做了以下操作,结果修改了每一行中的每个列序列

rows = [0,1]
cols = [2,2]
b=a[numpy.ix_(rows,columns)]

导致以下数组修改指定数组的每一列

array([[1, 0, 0],
       [4, 5, 6],
       [7, 0, 0]])

有人可以告诉我该怎么做?

非常感谢

编辑:需要注意的是,行和列恰好发生在顺序上。实际的一点是,这些可以是任意的,也可以是任何顺序。如果是rows = [a,b,c]和cols = [nxz]那么我想在位置(a,n),(b,x),(c,z)处准确修改三个元素。

4 个答案:

答案 0 :(得分:23)

添加其他人所说的内容,您可以使用花式索引修改这些元素,如下所示:

In [39]: rows = [0,1]

In [40]: cols = [2,2]

In [41]: a = np.arange(1,10).reshape((3,3))

In [42]: a[rows,cols] = 0

In [43]: a
Out[43]: 
array([[1, 2, 0],
       [4, 5, 0],
       [7, 8, 9]])

您可能希望阅读有关索引多维数组的文档: http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays

关键点是:

  

如果索引数组具有匹配的形状,并且存在索引数组   对于被索引的数组的每个维度,结果数组具有   与索引数组相同的形状,并且值对应于   为索引数组中的每个位置设置索引。

重要的是,这也允许您执行以下操作:

In [60]: a[rows,cols] = np.array([33,77])

In [61]: a
Out[61]: 
array([[ 1,  2, 33],
       [ 4,  5, 77],
       [ 7,  8,  9]])

您可以使用另一个相同大小的数组,列表或元组独立设置每个元素。

答案 1 :(得分:2)

首先,您对“正确”数组的描述与您指定的列和行不匹配...

要获得“正确”的数组,您可以这样做:

a[:2, 2] = 0

要修改第一行和第三行的第二列和第三列(行[0,2]和列[1,2]),你要做你正在做的事情......(你修改行的描述[0,2]和列[1,2]正是你得到的结果,对吗?)

答案 2 :(得分:1)

一个解决方法:ndarray.flatten, np.put(), ndarray.reshape

尝试ndarray.flatten(array),这样你就可以处理一个可以用numpy.put(array,[indices],[values])操纵的昏暗数组。然后使用ndarray.reshape()来获取原始尺寸。

答案 3 :(得分:0)

它应该像[0,2] = 0和[1,2] = 0一样简单。你也可以做[0:2,2] = 0。 python中基于':'的范围索引是半开区间[0,2],其实际范围从0到1(不包括2的结束点)。