我正在尝试将一个二维数组添加到一个三维数组中,并且索引不断变化,我想到了以下代码:
import numpy as np
a = np.zeros([8, 3, 5])
k = 0
for i in range(2):
for j in range(4):
a[k, i: i + 2, j: j + 2] += np.ones([2, 2], dtype=int)
k += 1
print(a)
这将会给我完全想要的东西:
[[[1. 1. 0. 0. 0.]
[1. 1. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0. 1. 1. 0. 0.]
[0. 1. 1. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0. 0. 1. 1. 0.]
[0. 0. 1. 1. 0.]
[0. 0. 0. 0. 0.]]
[[0. 0. 0. 1. 1.]
[0. 0. 0. 1. 1.]
[0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0.]
[1. 1. 0. 0. 0.]
[1. 1. 0. 0. 0.]]
[[0. 0. 0. 0. 0.]
[0. 1. 1. 0. 0.]
[0. 1. 1. 0. 0.]]
[[0. 0. 0. 0. 0.]
[0. 0. 1. 1. 0.]
[0. 0. 1. 1. 0.]]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 1. 1.]
[0. 0. 0. 1. 1.]]]
我希望能够更快地处理一个索引数组,因此我创建了一个数组并尝试使用np.vectorize。但正如手册所述,vectorize并不是用于提高性能的。我的目标是遍历一个形状为(10^6, 15, 15)的数组,最终需要进行10^6次迭代。我希望有一种更简洁的解决方案,可以消除所有的for循环。
这是我第一次使用stackoverflow,欢迎任何建议。
谢谢。
as_strided
来实现,但是具体的细节会花费一些时间。我建议从a
开始,或者对其进行简化,然后尝试找到一个索引所有 1 的方法(例如一个 (8,2,2) 的数组)。最后将该索引用于一个赋值表达式。 - hpaulj