Python 如何对数据数组列中的元素进行索引,以使输出为列向量?

Python 如何对数据数组列中的元素进行索引,以使输出为列向量?,python,numpy,indexing,numpy-ndarray,Python,Numpy,Indexing,Numpy Ndarray,我有一个nx2点数组,用ndarray表示。我想索引两个列向量之一的一些元素(索引也在一个数组中给出),这样输出就是一个列向量。但是,如果索引数组仅包含一个索引,则应返回(1,)形数组 我已经尝试了以下几件事,但都没有成功: 将numpy导入为np 点=np.数组([[0,1],[1,1.5],[2.5,0.5],[4,1],[5,2]]) index=np.array([0,1,2]) 点[索引,[0]->数组([0,1,2.5])->形状(3,) 点[[index],0]->数组([[0,1

我有一个nx2点数组,用ndarray表示。我想索引两个列向量之一的一些元素(索引也在一个数组中给出),这样输出就是一个列向量。但是,如果索引数组仅包含一个索引,则应返回(1,)形数组

我已经尝试了以下几件事,但都没有成功:

将numpy导入为np
点=np.数组([[0,1],[1,1.5],[2.5,0.5],[4,1],[5,2]])
index=np.array([0,1,2])
点[索引,[0]->数组([0,1,2.5])->形状(3,)
点[[index],0]->数组([[0,1,2.5]])->形状(1,3)
点[[索引],[0]]->数组([[0,1,2.5]])->形状(1,3)
点[index,0,np.newaxis]->数组([[0.],[1.],[2.5]])->所需形状(3,1)#
np.newaxis适用于此场景,但如果索引数组仅包含一个值,则它无法提供正确的形状:

将numpy导入为np
点=np.数组([[0,1],[1,1.5],[2.5,0.5],[4,1],[5,2]])
index=np.array([0])
点[index,0,np.newaxis]->数组([[0.]])->形状(1,1)
点[索引,[0]]->所需阵列([0.])->形状(1,)#
是否有可能在不根据索引数组的大小进行大小写区分的情况下,对数据数组进行索引,以便第一个示例的输出具有形状(3,1),第二个示例的输出具有形状(1,)


提前感谢您的帮助

我不确定我是否理解您问题中的措辞,但您似乎在使用
ndarray.swapaxes
方法(请参阅)

对于您的代码片段:

points = np.array([[0, 1], [1, 1.5], [2.5, 0.5], [4, 1], [5, 2]])
swapped = points.swapaxes(0,1)
print(swapped)
给予

我们可以使用以下选项选择3行:

In [330]: points[index,:]                                                                                    
Out[330]: 
array([[0. , 1. ],
       [1. , 1.5],
       [2.5, 0.5]])
但是,如果我们也选择一列,结果是1d,即使我们使用
[0]
。这是因为(3,)行索引针对(1,)列索引进行广播,从而产生(3,)结果:

如果我们制作行索引(3,1)形状,结果也是(3,1):

如果我们使用一个行切片,我们会得到同样的结果:

In [335]: points[0:3,[0]]                                                                                    
Out[335]: 
array([[0. ],
       [1. ],
       [2.5]])
使用
[index]
没有帮助,因为它会使行索引(1,3)成形,从而产生(1,3)结果。当然,您可以将其转置为(3,1)

带有1个元素
索引

In [336]: index1 = np.array([0])                                                                             
In [337]: points[index1[:,None],0]                                                                           
Out[337]: array([[0.]])
In [338]: _.shape                                                                                            
Out[338]: (1, 1)
In [339]: points[index1,0]                                                                                   
Out[339]: array([0.])
In [340]: _.shape                                                                                            
Out[340]: (1,)
如果行索引是标量,而不是1d:

In [341]: index1 = np.array(0)                                                                               
In [342]: points[index1[:,None],0]                                                                           
...
IndexError: too many indices for array
In [343]: points[index1[...,None],0]        # use ... instead                                                                 
Out[343]: array([0.])
In [344]: points[index1, 0]     # scalar result                                                                             
Out[344]: 0.0

我认为单独处理
np.array([0])
案例需要进行
if
测试。至少我想不出一个内置的
numpy
方法来埋葬它。

谢谢你的详细回答!我想到时候我会去处理案件。
In [333]: points[index[:,None],[0]]                                                                          
Out[333]: 
array([[0. ],
       [1. ],
       [2.5]])
In [334]: points[index[:,None],0]                                                                            
Out[334]: 
array([[0. ],
       [1. ],
       [2.5]])
In [335]: points[0:3,[0]]                                                                                    
Out[335]: 
array([[0. ],
       [1. ],
       [2.5]])
In [336]: index1 = np.array([0])                                                                             
In [337]: points[index1[:,None],0]                                                                           
Out[337]: array([[0.]])
In [338]: _.shape                                                                                            
Out[338]: (1, 1)
In [339]: points[index1,0]                                                                                   
Out[339]: array([0.])
In [340]: _.shape                                                                                            
Out[340]: (1,)
In [341]: index1 = np.array(0)                                                                               
In [342]: points[index1[:,None],0]                                                                           
...
IndexError: too many indices for array
In [343]: points[index1[...,None],0]        # use ... instead                                                                 
Out[343]: array([0.])
In [344]: points[index1, 0]     # scalar result                                                                             
Out[344]: 0.0