1 回答
TA贡献1877条经验 获得超1个赞
In [44]: data = np.arange(40).reshape(10,4)
通过制作第一个索引 (4,1) 形状,我们可以使用各种大小的第二个数组进行索引:
In [46]: data[np.arange(4)[:,None],[2]]
Out[46]:
array([[ 2],
[ 6],
[10],
[14]])
In [47]: data[np.arange(4)[:,None],[1,2]]
Out[47]:
array([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]])
第一个结果是 (4,1) 形状,第二个是 (4,2)。
我们得到squeeze(4,),相当于索引:
In [48]: data[np.arange(4),2]
Out[48]: array([ 2, 6, 10, 14])
np.ix_生成相似的索引集,例如 (4,1) 和 (1,2)
In [49]: np.ix_(np.arange(4),[1,2])
Out[49]:
(array([[0],
[1],
[2],
[3]]), array([[1, 2]]))
和 (4,1) 和 (1,1):
In [50]: np.ix_(np.arange(4),[2])
Out[50]:
(array([[0],
[1],
[2],
[3]]), array([[2]]))
(m,1) 使用 (1,n) 广播以产生 (m,n) 结果。(n,) 和 (1,n) 一样有效——同样是广播规则。
通过更改,您想为该 (m,n) 块分配一个值。在这种情况下,(4,2)和(4,1)一样有效。但是您想分配一个 (4,)。但是通过广播 (4,) 可以广播到 (1,4),但不能广播到 (4,1)。它可以添加前导维度,但不能添加尾随维度。
In [51]: data[np.arange(4)[:,None],[2]]=np.ones(4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-51-9245de6331ce> in <module>
----> 1 data[np.arange(4)[:,None],[2]]=np.ones(4)
ValueError: shape mismatch: value array of shape (4,) could not be
broadcast to indexing result of shape (4,1)
In [52]: data[np.arange(4)[:,None],[2]] = np.ones((4,1)) # (4,1) into (4,1)
# (4,1) also goes into a (4,2)
In [53]: data[np.arange(4),[2]] = np.ones(4) # (4,) into (4,)
In [55]: data[np.arange(4)[:,None],[1,2]] = np.zeros(2) # (2,) into (4,2)
flat可用于以 1d 方式分配值,但它在这里不起作用,因为 data[np.arange(4)[:,None],[1,2]]它是一个副本,如果它以任何方式使用,除非直接在__setitem__case 中使用,data[...] = ....
添加回答
举报
