0

我想为我的 numpy 数组中最右边的列找到一个表达式。

它包含一个数字和一个元组。这是其中的一个元素:

    str(my_list[0]) ='[0.04715440011642294\n 
                      (array([-0.50099999,  0.056     ,  1.61699998]),
                      0.046637045285032784)]'

我不确定如何最好地格式化它,但我至少可以清楚 \n 分隔元素,因此 my_list[0] 包含两个元素:0.04715440011642294 和 (array([-0.50099999, 0.056 , 1.61699998]), 0.046637045285032784)。

我想要的是包含元组内部所有第二个元素的列。因此,例如,如果第二个元素是

str(my_list[1]) = '[0.04740093197112796\n
                   (array([-0.505     ,  0.058     ,  1.61699998]),
                   0.047308142646754925)]'

那我想要

 [0.046637045285032784, 0.047308142646754925]

如果我尝试str(my_list[:, 1::][0]),我可以单独获得元组:

'[(array([-0.50099999, 0.056 , 1.61699998]), 0.046637045285032784)]'

但是,当我尝试使用与获取列表第二列相同的技术来访问元组的第二列时,它不起作用。

my_list[:, 1::][:, 1::]具有正确的长度,但充满了空元素。我做了很多尝试来获得正确的语法,但我无法终生提取我想要的列。这尤其令人沮丧,因为我可以轻松键入my_list[:-1, 1::][0][0][1]并获取我想要的列的第一个元素。当然,如果我能得到一个元素,我应该能够找到该列的表达式吗?

4

3 回答 3

1

我可以通过以下方式重新创建您my_list[0]的:

In [73]: x =np.array([0.04715440011642294, (np.array([-0.50099999,  0.056     ,  1.61699998]), 0.046637045285032784)])                                                                                           

In [75]: print(x)                                                                                            
[0.04715440011642294
 (array([-0.50099999,  0.056     ,  1.61699998]), 0.046637045285032784)]
In [76]: x.shape, x.dtype                                                                                    
Out[76]: ((2,), dtype('O'))

这是一个 2 元素对象 dtype 数组。同样对于第二个数组:

In [77]: y=np.array([0.04740093197112796, 
    ...:                    (np.array([-0.505     ,  0.058     ,  1.61699998]), 
    ...:                    0.047308142646754925)])              

并将它们加入一个数组:

In [78]: xy = np.array((x,y))                                                                                
In [79]: xy                                                                                                  
Out[79]: 
array([[0.04715440011642294,
        (array([-0.50099999,  0.056     ,  1.61699998]), 0.046637045285032784)],
       [0.04740093197112796,
        (array([-0.505     ,  0.058     ,  1.61699998]), 0.047308142646754925)]],
      dtype=object)

In [82]: xy.shape, xy.dtype                                                                                  
Out[82]: ((2, 2), dtype('O'))

第一列:

In [83]: xy[:,0]                                                                                             
Out[83]: array([0.04715440011642294, 0.04740093197112796], dtype=object)

第二列

In [84]: xy[:,1]                                                                                             
Out[84]: 
array([(array([-0.50099999,  0.056     ,  1.61699998]), 0.046637045285032784),
       (array([-0.505     ,  0.058     ,  1.61699998]), 0.047308142646754925)],
      dtype=object)

这是一个具有两个元素元组的 (2,) 形状数组。

要从每个元组中获取第二个元素,我必须使用列表理解:

In [85]: [i[1] for i in xy[:,1]]                                                                             
Out[85]: [0.046637045285032784, 0.047308142646754925]

您不能对这些元组进行索引,就好像它们是原始数组的维度一样。


如果您将 (2,2) 索引为1:(2,1) 形状:

In [87]: xy[:,1:]                                                                                            
Out[87]: 
array([[(array([-0.50099999,  0.056     ,  1.61699998]), 0.046637045285032784)],
       [(array([-0.505     ,  0.058     ,  1.61699998]), 0.047308142646754925)]],
      dtype=object)
In [88]: _.shape                                                                                             
Out[88]: (2, 1)

1:再次生成 0 维度的索引。在 Python 中,如果您对超出其大小的列表或数组进行索引,则会得到空结果(而不是错误):

In [89]: xy[:,1:][:,1:]                                                                                      
Out[89]: array([], shape=(2, 0), dtype=object)

shape当您有一个对象 dtype 数组时,您必须注意dtype每个级别 - 或者len该级别是列表还是元组。混合数字和数组/列表/元组会创建一个比数字数组复杂得多的结构。除非你有明确的目标感,否则尽量不要这样做。

于 2019-08-17T01:36:19.000 回答
0

使用列表理解很容易:

ex = [[1, (2, 3)], [4, (5, 6)], [7, (8, 9)]]
print([i[1][1] for i in ex])

这个最小的示例输出 [3, 6, 9]。所以使用的函数是:

def getIndexes(ex):
    return [i[1][1] for i in ex]
于 2019-08-16T20:18:03.367 回答
0

你的意思是这样的吗?

import numpy as np


my_list = [[1, (np.array([11, 12, 13]), 14)],
           [2, (np.array([21, 22, 23]), 24)],
           [3, (np.array([31, 32, 33]), 34)]]

print([row[1][1] for row in my_list])

[14、24、34]

如果 my_list 是一个 numpy 数组,它的工作原理是一样的。

于 2019-08-16T22:04:51.517 回答