这可能是不可能的,因为中间数组将有可变长度的行。我试图完成的是为具有由我的边界数组分隔的ad索引的元素的数组赋值。例如:
bounds = np.array([[1,2], [1,3], [1,4]])
array = np.zeros((3,4))
__assign(array, bounds, 1)
赋值后应该会产生
array = [
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 1, 1, 1]
]
我已经尝试过类似的东西在各种迭代没有成功:
ind = np.arange(array.shape[0])
array[ind, bounds[ind][0]:bounds[ind][1]] = 1
我试图避免循环,因为这个函数会被调用很多次。有什么想法吗?
3条答案
按热度按时间zkure5ic1#
我绝不是Numpy的Maven,但从我能找到的不同数组索引选项来看,这是我能找到的最快的解决方案:
这里我们迭代边界列表并使用切片引用列。
我尝试了下面的方法,首先构造一个列索引列表和一个行索引列表,但是速度慢得多。在我的笔记本电脑上,对于一个10000 x 10000的数组,10秒加上vir 0. 04秒。我猜切片会产生巨大的差异。
5kgi1eie2#
纯粹的NumPy方法解决这个问题的一个问题是,不存在使用另一个NumPy数组在轴上的边界来"切片" NumPy数组的方法。因此,得到的扩展边界最终成为列表的可变长度列表,如
[[1],[1,2],[1,2,3]
。然后,您可以使用np.eye
和np.sum
over axis = 0来获得所需的输出。我尝试了各种方法来将
np.eye(4)
从[start:stop]切片到一个由start和stop组成的NumPy数组上,但遗憾的是,您需要一次迭代才能完成。一个二个一个一个
avwztpqn3#
使用
numba.njit
装饰器带有
numba.njit
不含
numba.njit