Numpy:将 xyzV 表转换为网格

问题描述 投票:0回答:1

我有这个文本文件,我可以使用

numpy.loadtxt
将其读入二维数组:

 X   Y   Z   V
-30 -15 -25  2
-29 -15 -25  2.1
-28 -15 -25  2.2
 .   .   .    .
 .   .   .    .
+29 -15 -25  2.1
+30 -15 -25 -2.0
-30 -14 -25  2   # now iterating X values while Y=-14
-29 -14 -25  2.1
-28  .   .   2.2
 .   .   .    .
 .   .   .    .
+29 -13 -25  2.1
+30 -13 -25 -2.0 # now iterating X values while Y=-13, and so on...
 .   .   .    .
 .   .   .    .
 .   .   .    .
 .   .   .    .

X、Y 和 Z 的范围不一定是整数,并且如上所示,在所有轴上并不相同。我想用这些数据创建一个网格,即获取这样的数组:

>>> np.shape(V)
(61,31,51)
>>> np.shape(x)
(61,)
>>> np.shape(y)
(31,)
>>> np.shape(z)
(51,)

我在这里看到了一个几乎相同的问题,但很明显看到那里的答案依赖于这样一个事实:

X
Y
列包含从已知的正数开始的整数。

python numpy reshape
1个回答
0
投票

假设表格与 X、Y 和 Z 值的重复一致,您可以使用

np.unique
len
来计算结果数组应获得的形状。这是一个完整的工作代码:

import numpy as np

table = np.loadtxt("potential.csv", delimeter=",", skiprows=1)
x = np.unique(table[:,0])
y = np.unique(table[:,1])
z = np.unique(table[:,2])

potential = np.zeros((len(x), len(y), len(z)))
for i in range(len(z)):
    for j in range(len(y)):
        for k in range(len(x)):
            index = k + j*len(x)+ i*len(y)*len(x)
            potential[k,j,i] = table[index, 3]

np.reshape
不适合这种情况。为了在
index
的一维数组中获得正确的
table
,您必须利用在所有 X 值迭代后 Y 值发生更改的事实。因此,我们将
j
乘以
x
的长度。 Z 索引与 X 和 Y 长度的关系也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.