12
通常numpy强制任务的左侧和右侧匹配,所以例如如果我做a[:] = b
,b
必须是相同的形状或广播为a
相同的形状。但似乎是一个例外,该规则:Numpy花哨的索引和任务
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = a.copy()
>>> a[[0,1,2]] = b[::2]
>>> a
array([0, 2, 4, 3, 4, 5, 6, 7, 8, 9])
>>> a[np.arange(10)] = b[:2]
>>> a
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
它似乎只与一维数组且仅当出现在赋值的左侧看中索引工作,但我一直没能找到任何地方的这种行为文档。这种行为是否记录在案,如果有的话,还有人可以举例说明何时可能有用吗?
更新:
看来,numpy的flatiter类型的行为也是这样的,有flatiter和花哨的索引,我不知道之间有着某种联系?
>>> a.flat = [10,11]
>>> a
array([10, 11, 10, 11, 10, 11, 10, 11, 10, 11])
>>> a.flat[:] = [2,3,4]
>>> a
array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2])
>>> a.flat = range(100)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
您正确地描述了此功能 - 仅在与一维阵列上的高级索引结合使用分配时才允许它。虽然我确定在文档中阅读了这些内容,但目前我找不到链接。我觉得现在和当时有用,不过我认为如果这是由专用功能支持并且定期分配仍然会给出错误,情况会更好。 – 2012-02-24 01:39:02
对,我很快认为它只是广播,但我现在看到它实际上并不符合广播要求!奇怪的! – wim 2012-02-24 03:20:46
我不确定它是一个功能还是一个bug ......至少,http://docs.scipy.org/doc/numpy/reference/internals.code-explanations.html#getting-or-setting似乎不是把这作为一个特例提及。 – Tanriol 2012-02-28 20:26:32