【问题标题】:How do I access array elements if the dimension can vary?如果维度可以变化,我如何访问数组元素?
【发布时间】:2020-02-21 23:00:38
【问题描述】:

例如,我将数据存储在数组中

myList = array([('A', 3, 2, 5),('B', 3, 7, 0),dtype=[('f0', '<U128'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

它具有恒定数量的 >2 列和任意数量的行。 我想将第二列读入一个新数组。我知道我可以做到这一点

[x[1] for x in myList]

list(zip(*myList))[1]

但我的问题是,在某些情况下数组只有一行,那么我只想要值myList[1] 和上面的代码。我可以为此使用 if 条件,但我想知道是否有更有效的方法来处理数组,当维度可以变化时?

【问题讨论】:

  • 列数总是相同的,所以只有在有 0 行时才会出现这种情况,这不是问题。问题是,当有 1 行时,因为数组只有 1 个索引
  • 只有一行的时候,我想要列表的第二个条目,所以myList[1]
  • myList 的类型是 np.ndarray?还是实际的 list 类型?
  • 嵌套列表是什么意思? genfromtxt 不返回列表。它将返回一个二维数组或一个带有复合 dtype 的一维数组。 shapedtype 的数组是什么?
  • 是的,你是对的,我对类型不精确。因此,mylist 的类型为 np.ndarray,如果多于 1 行,mylist[0] 的类型为 np.void。这意味着,我可以通过[[x[1] for x in mylist] if isinstance(mylist[1], np.void) else mylist[1]] 做到这一点

标签: python list numpy indexing


【解决方案1】:

我已尝试重现该问题。我制作了一个 txt 文件,其中包含:

'A', 3, 2, 5
'B', 3, 7, 0

使用 numpys genfromtext 加载此文件会导致您的数组。无论行数如何,以下代码都会提取第一列:

import numpy as np

myList = np.genfromtxt("startFile.txt", dtype="U128,f8,f8", delimiter=",")
numRows = np.shape([myList])[0]
reshapedList = np.reshape(myList, (numRows, -1))
columnValues = [x[1] for x in reshapedList[0]]
print(f"column values: {columnValues}")

希望对你有帮助!

【讨论】:

    【解决方案2】:

    假设myList 是一个实际的numpy 数组,

    def func(arr):
        if len(arr.shape) == 1:
            return arr[1]
        else:
            return arr[:, 1]
    
    result = func(myList)
    

    如果 myListlist 类型而不是:

    def func(lst):
        if isinstance(lst[0], list):
            return [x[1] for x in lst]
        else:
            return lst[1]
    

    【讨论】:

      【解决方案3】:

      这可能有用吗?

      myList = [[1],[1,2,3],[1,2]]
      [*map(lambda x: x[1] if len(x)>1 else None,  myList)]
      

      【讨论】:

      • 感谢您的回答,但我的情况不同。子列表的长度相同,但 myList 的长度可以变化
      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2014-08-04
      • 2018-10-14
      相关资源
      最近更新 更多