Как получить доступ к элементам массива, если размерность может варьироваться? - PullRequest
1 голос
/ 25 октября 2019

У меня есть данные, хранящиеся в массиве, например,

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

У него есть постоянное количество столбцов> 2 и произвольное количество строк. Я хотел бы прочитать 2-й столбец в новый массив. Я знаю, что могу сделать это с

[x[1] for x in myList]

или

list(zip(*myList))[1]

Но проблема в моем случае состоит в том, что в некоторых случаях массив имеет только одну строку, тогда я хочу толькозначение myList[1] и вышеуказанный код. Я мог бы использовать условие if для этого, но мне было интересно, есть ли более эффективный способ обработки массива, когда размер может варьироваться?

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Это может сработать?

myList = [[1],[1,2,3],[1,2]]
[*map(lambda x: x[1] if len(x)>1 else None,  myList)]
0 голосов
/ 31 октября 2019

Я попытался воссоздать проблему. Я сделал текстовый файл, содержащий:

'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}")

Надеюсь, это поможет!

0 голосов
/ 25 октября 2019

При условии myList - это фактический numpy массив,

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

result = func(myList)

Если myList имеет тип list вместо:

def func(lst):
    if isinstance(lst[0], list):
        return [x[1] for x in lst]
    else:
        return lst[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...