我正在设置2D数组中多个元素的值,但是我的数据有时包含给定索引的多个值。
似乎总是分配了“更高”的值(请参见下面的示例),但是是否可以保证此行为,或者是否有机会获得不一致的结果?我怎么知道我可以按照我在矢量化分配中想要的方式来解释“稍后”?
也就是说,在我的第一个示例中,a肯定会始终包含4该内容,而在第二个示例中,它将打印values[0]吗?
a
4
values[0]
很简单的例子:
import numpy as np indices = np.zeros(5,dtype=np.int) a[indices] = np.arange(5) a # array([4])
另一个例子
import numpy as np grid = np.zeros((1000, 800)) # generate indices and values xs = np.random.randint(0, grid.shape[0], 100) ys = np.random.randint(0, grid.shape[1], 100) values = np.random.rand(100) # make sure we have a duplicate index print values[0], values[5] xs[0] = xs[5] ys[0] = ys[5] grid[xs, ys] = values print "output value is", grid[xs[0], ys[0]] # always prints value of values[5]
在NumPy 1.9和更高版本中,通常不会对此进行很好的定义。
当前实现使用单独的迭代器同时遍历所有(广播的)花式索引(和分配数组),并且这些迭代器均使用C阶。换句话说,目前可以。由于您可能想更准确地了解它。如果mapping.c在处理这些问题的NumPy中进行比较,您会看到它使用PyArray_ITER_NEXT,该文档记录为C顺序。
mapping.c
PyArray_ITER_NEXT
为了将来,我会以不同的方式描绘这幅画。我认为使用更新的迭代器将所有索引+赋值数组一起迭代将是很好的。如果这样做,则可以保留订单以供迭代器决定最快的方式。如果您对迭代器保持开放状态,很难说会发生什么,但是您不能确定您的示例是否有效(可能仍然是一维情况,但是…)。
因此,据我所知,它目前可以使用,但尚未记录(据我所知),因此,如果您确实认为应该确保这样做,则需要游说并最好编写一些测试以确保它可以得到保证。因为至少有人倾向于说:如果它使事情变得更快,就没有理由确保C阶,但是当然也许有一个很好的理由隐藏在某处…
真正的问题是:您为什么仍要这么做?;)