我有一个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)处准确修改三个元素。
答案 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的结束点)。