Python Numpy:ndarray中行的元组索引(用于以后选择子集)
我是NumPy的新手,也不是最有经验的Python程序员, 所以,如果这对你来说微不足道,请原谅;) 我正在写一个脚本,从几个分子动力学模拟中提取特定数据。 因此,我从一些文件中读取数据,并将它们修改和截断为统一的长度 并按行将所有内容添加到一起,以形成每个模拟运行的二维阵列 这些数组相互附加,因此我最终得到一个3D数组,其中沿z轴的每个切片将表示特定模拟运行的数据集。 目标是以后进行简单的操作,例如,在所有模拟运行中求平均值 这只是给你一个基本的想法:Python Numpy:ndarray中行的元组索引(用于以后选择子集),python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我是NumPy的新手,也不是最有经验的Python程序员, 所以,如果这对你来说微不足道,请原谅;) 我正在写一个脚本,从几个分子动力学模拟中提取特定数据。 因此,我从一些文件中读取数据,并将它们修改和截断为统一的长度 并按行将所有内容添加到一起,以形成每个模拟运行的二维阵列 这些数组相互附加,因此我最终得到一个3D数组,其中沿z轴的每个切片将表示特定模拟运行的数据集。 目标是以后进行简单的操作,例如,在所有模拟运行中求平均值 这只是给你一个基本的想法: import numpy as np
import numpy as np
A = np.zeros((2000), dtype = bool)
A = A.reshape((1, 2000))
# Appending different rows to form a '2D-Matrix',
# this is the actual data per simulation run
for i in xrange(1,103):
B = np.zeros((2000), dtype = bool)
B = B.reshape((1, 2000))
A = np.concatenate((A, B), axis=0)
print A.shape
# >>> (2000, 103)
C = np.expand_dims(A, axis=2)
A = np.expand_dims(A, axis=2)
print A.shape
# >>> (2000, 103, 1)
# Appending different '2D-Matrices' to form a 3D array,
# each slice along the z-Axis representing one simulation run
for i in xrange(1,50):
A = np.concatenate((A, C), axis=2)
print A.shape
# >>> (2000, 103, 50)
到目前为止还不错,现在来谈谈实际问题:
在一个2D数组中,每一行代表一组不同的相互作用的原子对。
稍后,我想根据不同的标准创建数组的子集,例如“显示所有对,其中距离x为10numpy
中处理索引
简短的一般回答:
我基本上只是创建了一个作为python列表的查找表,并使用掩码对选择进行了非常简单的numpy切片操作,其中包含索引:
A = [[[1, 2],
[3, 4],
[5, 6]],
[[7, 8],
[9,10],
[11,12]]]
A = np.asarray(A)
# selects only rows 1 and 2 from each 2D array
mask = [1,2]
B = A[ : , mask, : ]
这为B
:
[[[ 3 4]
[ 5 6]]
[[ 9 10]
[11 12]]]
完整答案,针对我的上述问题:
这是我的2D阵列:
A =[[True, False, False, False, False],
[False, True, False, False, False],
[False, False, True, False, False]]
A = np.asarray(A)
将行索引为元组,这是由于我的特定问题
e、 g:
附加其他二维阵列以形成三维阵列:
C = np.expand_dims(A, axis=0)
A = np.expand_dims(A, axis=0)
A = np.concatenate((A, C), axis=0)
这是3D阵列A
:
>[[[ True False False False False]
[False True False False False]
[False False True False False]]
[[ True False False False False]
[False True False False False]
[False False True False False]]]
选择在查找表中包含“3”的行
mask = [i for i, v in enumerate(lut) if 3 in v]
> [1, 2]
将遮罩应用于三维阵列:
B = A[ : , mask, : ]
现在B
是选择后的3D阵列A
:
[[[False True False False False]
[False False True False False]]
[[False True False False False]
[False False True False False]]]
要跟踪B
的新索引,请执行以下操作:
创建新的查找表以进行进一步计算:
newLut = [v for i, v in enumerate(lut) if i in mask]
>[(3, 4), (3, 5)]
暂时从3d数组中退一步,尝试使用小列表、元组和/或字典来说明任务。使它具体的长度,你可以完全显示。目前的描述很难理解。
B = A[ : , mask, : ]
[[[False True False False False]
[False False True False False]]
[[False True False False False]
[False False True False False]]]
newLut = [v for i, v in enumerate(lut) if i in mask]
>[(3, 4), (3, 5)]