Python Numpy:ndarray中行的元组索引(用于以后选择子集)

Python Numpy:ndarray中行的元组索引(用于以后选择子集),python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我是NumPy的新手,也不是最有经验的Python程序员, 所以,如果这对你来说微不足道,请原谅;) 我正在写一个脚本,从几个分子动力学模拟中提取特定数据。 因此,我从一些文件中读取数据,并将它们修改和截断为统一的长度 并按行将所有内容添加到一起,以形成每个模拟运行的二维阵列 这些数组相互附加,因此我最终得到一个3D数组,其中沿z轴的每个切片将表示特定模拟运行的数据集。 目标是以后进行简单的操作,例如,在所有模拟运行中求平均值 这只是给你一个基本的想法: import numpy as np

我是NumPy的新手,也不是最有经验的Python程序员, 所以,如果这对你来说微不足道,请原谅;)

我正在写一个脚本,从几个分子动力学模拟中提取特定数据。 因此,我从一些文件中读取数据,并将它们修改和截断为统一的长度 并按行将所有内容添加到一起,以形成每个模拟运行的二维阵列

这些数组相互附加,因此我最终得到一个3D数组,其中沿z轴的每个切片将表示特定模拟运行的数据集。 目标是以后进行简单的操作,例如,在所有模拟运行中求平均值

这只是给你一个基本的想法:

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为10 我自己回答了这个问题,为了便于记录,您可以在下面找到它。它是特定的,但可能有助于某人在
numpy
中处理索引

简短的一般回答:

我基本上只是创建了一个作为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)]