gpt4 book ai didi

python - 按体素随机播放 4 维时间序列

转载 作者:行者123 更新时间:2023-11-28 22:24:19 25 4
gpt4 key购买 nike

我有一个 4 维数组,它是 3 维数组的时间序列。我想沿时间轴打乱 3 维数组中的每个点。这是我使用嵌套的 for 循环编写的代码。这可以用花哨的 numpy 索引来完成吗?速度是一个因素。谢谢。

import numpy as np

timepoints = 2
x = 4
y = 4
z = 3

vol_1 = np.zeros((x, y, z))
vol_2 = np.ones((x, y, z))
timeseries = np.array((vol_1, vol_2))

timeseries.shape # (2, 4, 4, 3)

# One voxel over time.
timeseries[:, 0, 0, 0]

for xx in range(x):
for yy in range(y):
for zz in range(z):
np.random.shuffle(timeseries[:, xx, yy, zz])

最佳答案

我们可以沿第一个轴生成所有打乱的索引,然后简单地使用 advanced-indexing获得随机版本。现在,为了获得那些所有打乱的索引,我们可以生成一个与输入数组形状相同的随机数组,并获得沿第一个轴的 argsort 索引。之前已经探索过,如here .

因此,我们将有一个像这样的矢量化实现 -

m,n,r,p = a.shape # a is the input array
idx = np.random.rand(*a.shape).argsort(0)
out = a[idx, np.arange(n)[:,None,None], np.arange(r)[:,None], np.arange(p)]

只是为了向读者解释问题到底是什么,这里有一个示例运行 -

1)输入4维数组:

In [711]: a
Out[711]:
array([[[[60, 22, 34],
[29, 18, 79]],

[[11, 69, 41],
[75, 30, 30]]],


[[[63, 61, 42],
[70, 56, 57]],

[[70, 98, 71],
[29, 93, 96]]]])

2) 使用所提出的沿第一个轴进行索引的方法生成的随机索引:

In [712]: idx
Out[712]:
array([[[[1, 0, 1],
[0, 1, 1]],

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


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

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

3) 最后索引到输入数组中以进行混洗输出:

In [713]: out
Out[713]:
array([[[[63, 22, 42],
[29, 56, 57]],

[[11, 69, 71],
[29, 30, 96]]],


[[[60, 61, 34],
[70, 18, 79]],

[[70, 98, 41],
[75, 93, 30]]]])

仔细观察,我们会在 a[0,0,0,0]60 处看到 63 a[1,0,0,0] 由于 idx 值为 10 而被交换> 分别在 idx 中相应的位置。接下来,2261 留在它们的位置,因为 idx 值是 01 等等。

运行时测试

In [726]: timeseries = np.random.rand(10,10,10,10)

In [727]: %timeit org_app(timeseries)
100 loops, best of 3: 5.24 ms per loop

In [728]: %timeit proposed_app(timeseries)
1000 loops, best of 3: 289 µs per loop

In [729]: timeseries = np.random.rand(50,50,50,50)

In [730]: %timeit org_app(timeseries)
1 loop, best of 3: 720 ms per loop

In [731]: %timeit proposed_app(timeseries)
1 loop, best of 3: 426 ms per loop

在大尺寸情况下,创建随机数组的成本被证明是所提出方法的瓶颈,但与原始循环版本相比仍然显示出良好的加速。

关于python - 按体素随机播放 4 维时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475929/

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