gpt4 book ai didi

python - 将二维数组添加到具有快速不断变化的索引的三维数组

转载 作者:行者123 更新时间:2023-11-28 17:04:18 25 4
gpt4 key购买 nike

我试图将一个二维数组添加到一个索引不断变化的三维数组中,我想出了以下代码:

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。但正如手册所述,矢量化不是为了性能。我的目标是运行一个形状为 (10^6, 15, 15) 的数组,最终迭代 10^6 次。我希望有一些更清洁的解决方案可以摆脱所有的 for 循环。

这是我第一次使用堆栈溢出,欢迎任何建议。

谢谢。

最佳答案

使用 numpy.lib.stride_tricks 的高效解决方案,它可以“查看”所有的可能性。

N=4 #tray size #(square)
P=3 # chunk size
R=N-P

from numpy.lib.stride_tricks import as_strided

tray = zeros((N,N),numpy.int32)
chunk = ones((P,P),numpy.int32)
tray[R:,R:] = chunk
tray = np.vstack((tray,tray))
view = as_strided(tray,shape=(R+1,R+1,N,N),strides=(4*N,4,4*N,4))
a_view = view.reshape(-1,N,N)
a_hard = a_view.copy()

结果如下:

In [3]: a_view
Out[3]:
array([[[0, 0, 0, 0],
[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 1, 1, 1]],

[[0, 0, 0, 0],
[1, 1, 1, 0],
[1, 1, 1, 0],
[1, 1, 1, 0]],

[[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 0, 0, 0]],

[[1, 1, 1, 0],
[1, 1, 1, 0],
[1, 1, 1, 0],
[0, 0, 0, 0]]])

a_view 只是托盘上 block 的可能位置的 View 。它不需要任何计算,而且只使用两倍的托盘空间。 a_hard 是硬拷贝,如果你需要修改它是必需的。

关于python - 将二维数组添加到具有快速不断变化的索引的三维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52118339/

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