gpt4 book ai didi

python - 处理 NumPy 分配中的重复索引

转载 作者:IT老高 更新时间:2023-10-28 22:22:23 26 4
gpt4 key购买 nike

我在二维数组中设置多个元素的值,但是我的数据有时包含给定索引的多个值。

似乎总是分配“稍后”的值(参见下面的示例),但这种行为是否得到保证,或者我是否有可能得到不一致的结果?我怎么知道我可以在矢量化赋值中以我想要的方式解释“稍后”?

即在我的第一个示例中,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 顺序。换句话说,目前,是的,你可以。因为您可能想更准确地了解它。如果您比较处理这些事情的 NumPy 中的 mapping.c,您会发现它使用了 PyArray_ITER_NEXT,即 documented以 C 顺序排列。

对于 future ,我会以不同的方式描绘这幅画。我认为使用较新的迭代器一起迭代所有索引+赋值数组会很好。如果这样做了,那么订单可以保持开放,以便迭代器决定最快的方式。如果你保持它对迭代器开放,很难说会发生什么,但你不能确定你的例子是否有效(可能一维情况你仍然可以,但是......)。

所以,据我所知,它目前可以工作,但它是无证的(据我所知),所以如果你真的认为应该确保这一点,你需要游说它并最好编写一些测试来制作当然可以保证。因为至少我很想说:如果它让事情变得更快,就没有理由确保 C-order,但当然也许有一个很好的理由隐藏在某个地方......

这里真正的问题是:你为什么要那样做? ;)

关于python - 处理 NumPy 分配中的重复索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com