2011-10-13 34 views
22

我有一个2D 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]]) 

有人可以请让我知道该怎么做?

非常感谢

编辑:这是要注意的行和列巧合happend是sequentia。实际的观点是这些可能是任意的,并且可以以任何顺序。如果它是rows = [a,b,c]和cols = [n x z],那么我想修改位置(a,n),(b,x),(c,z)上的三个元素。

回答

16

添加到其他人所说,你可以按如下修改使用花哨的索引这些元素:

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

关键点是:

如果索引数组具有匹配的形状,并且每个dim都有一个索引数组 被索引的数组的大小,得到的数组具有与索引数组相同的形状 ,并且这些值对应于索引数组中每个位置的索引集 。

重要的,这也可以让你做这样的事情:

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

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

在那里你可以单独设置每个元素使用另一个阵列,列表或同样大小的元组。

+0

你说得很对。感谢您指向文档。这是程序中的一个错误。我知道但不能工作。你的回答非常具有说服力。 – Shan

+0

你在做什么[x]语法? –

+0

@johnktejik这只是ipython/jupyter笔记本执行单元的输出。把它想象成一行号码提示符。 – JoshAdel

2

首先,你的“正确的”数组不匹配您指定的行和列的说明...

为了让您的“正确”的数组,你可以这样做:

a[:2, 2] = 0 

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

+1

重点是我不希望它顺序...列和行可以是任意数字。 – Shan

0

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

1

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

尝试ndarray.flatten(array),你面对的一个昏暗的阵列可与numpy.put(array,[indices],[values])被操纵的方式。然后使用ndarray.reshape()来达到原始尺寸。

相关问题