gpt4 book ai didi

arrays - 将 3D numpy 数组转换为 3 个索引的列表

转载 作者:行者123 更新时间:2023-12-01 03:00:37 25 4
gpt4 key购买 nike

所以我有一个大的 3D 数据矩阵,比如 10000X10000X1000,现在我需要做的是遍历 3D 数据矩阵的每个元素并将索引和 2 的值写入文件大小相同的不同矩阵,一条线的例子:

i j k val1 val2

我目前所做的是在 3 个嵌套循环中运行并按以下方式打印它,例如 2 个小型 3D 数据矩阵和方法:

import numpy as np


vv1= np.array([[[1,2,3],[2,3,4],[3,4,5]],
[[4,5,6],[5,6,7],[6,7,8]],
[[7,8,9],[8,9,10],[9,10,11]]])

vv2= np.array([[[1,2,3],[2,3,4],[3,4,5]],
[[4,5,6],[5,6,7],[6,7,8]],
[[7,8,9],[8,9,10],[9,10,11]]])

for x in range(vv1.shape[0]):
for y in range(vv1.shape[1]):
for z in range(vv1.shape[2]):
print("{:} {:} {:} {:} {:}".format(x,y,z,vv1[x,y,z], vv2[x,y,z]))

这个简单的代码可以完成工作,但速度很慢。

我想到的另一种方法是创建一个 1D 长向量,每个条目将是 3 个索引值,然后将相同的逻辑应用于打印,例如嵌套循环示例:

vv_ind = []

for x in range(vv1.shape[0]):
for y in range(vv1.shape[1]):
for z in range(vv1.shape[2]):
vv_ind.append([x,y,z])

for elem in vv_ind:
i = tuple(elem)
print("{:} {:} {:} {:} {:}".format(*elem, vv1[i], vv2[i]))

它给出了所需的输出。

我的问题如下:

  1. 是否有更“pythonic”的方法来创建该索引列表?
  2. 关于最后一个打印循环:

    for elem in vv_ind:
    i = tuple(elem)
    print("{:} {:} {:} {:} {:}".format(*elem, vv1[i], vv2[i]))

    有没有更有效的方法呢?

同样,这里给出的数组只是为了方便起见的虚拟数组

希望得到一些帮助

最佳答案

您可以使用 np.mgrid用于生成索引,如果您不介意将所有内容保存为相同的数据类型,您可以将数组堆叠在一起并通过 np.savenp.savetxt :

In [1]: import numpy as np                                                                    

In [2]: a = np.random.randint(0, 255, size=(4, 4, 4))

In [3]: b = np.random.randint(0, 255, size=(4, 4, 4))

In [4]: data = np.stack([x.ravel() for x in np.mgrid[:4, :4, :4]] + [a.ravel(), b.ravel()], axis=1)

In [5]: np.save('/tmp/test.npy', data)

In [6]: data
Out[6]:
array([[ 0, 0, 0, 169, 35],
[ 0, 0, 1, 14, 120],
[ 0, 0, 2, 93, 207],
[ 0, 0, 3, 70, 158],
[ 0, 1, 0, 115, 52],
[ 0, 1, 1, 10, 248],
[ 0, 1, 2, 5, 123],
[ 0, 1, 3, 125, 143],
[ 0, 2, 0, 73, 241],
[ 0, 2, 1, 25, 118],
[ 0, 2, 2, 240, 159],
[ 0, 2, 3, 60, 179],
[ 0, 3, 0, 29, 221],
[ 0, 3, 1, 214, 33],
[ 0, 3, 2, 145, 60],
[ 0, 3, 3, 207, 74],
[ 1, 0, 0, 7, 37],
[ 1, 0, 1, 146, 192],
[ 1, 0, 2, 227, 83],
[ 1, 0, 3, 247, 51],
[ 1, 1, 0, 253, 18],
[ 1, 1, 1, 188, 2],
[ 1, 1, 2, 164, 252],
[ 1, 1, 3, 192, 229],
[ 1, 2, 0, 18, 236],
[ 1, 2, 1, 85, 48],
[ 1, 2, 2, 20, 233],
[ 1, 2, 3, 81, 152],
[ 1, 3, 0, 122, 30],
[ 1, 3, 1, 227, 221],
[ 1, 3, 2, 11, 247],
[ 1, 3, 3, 84, 203],
[ 2, 0, 0, 5, 94],
[ 2, 0, 1, 174, 179],
[ 2, 0, 2, 224, 222],
[ 2, 0, 3, 168, 40],
[ 2, 1, 0, 160, 136],
[ 2, 1, 1, 16, 121],
[ 2, 1, 2, 237, 241],
[ 2, 1, 3, 70, 29],
[ 2, 2, 0, 127, 188],
[ 2, 2, 1, 33, 67],
[ 2, 2, 2, 4, 138],
[ 2, 2, 3, 153, 114],
[ 2, 3, 0, 162, 8],
[ 2, 3, 1, 254, 91],
[ 2, 3, 2, 153, 69],
[ 2, 3, 3, 167, 33],
[ 3, 0, 0, 99, 101],
[ 3, 0, 1, 26, 2],
[ 3, 0, 2, 162, 131],
[ 3, 0, 3, 23, 97],
[ 3, 1, 0, 226, 37],
[ 3, 1, 1, 5, 130],
[ 3, 1, 2, 215, 164],
[ 3, 1, 3, 247, 95],
[ 3, 2, 0, 138, 49],
[ 3, 2, 1, 248, 175],
[ 3, 2, 2, 134, 39],
[ 3, 2, 3, 170, 67],
[ 3, 3, 0, 1, 177],
[ 3, 3, 1, 245, 31],
[ 3, 3, 2, 71, 160],
[ 3, 3, 3, 81, 9]])

否则你也可以使用np.ndindex遍历数组索引:

In [10]: with open('/tmp/test.txt', 'w') as fh: 
...: for index in np.ndindex(*a.shape):
...: data = map(str, index + (a[index], b[index]))
...: fh.write(','.join(data) + '\n')

关于arrays - 将 3D numpy 数组转换为 3 个索引的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59193678/

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