Присоединение к массиву Numpy создает один большой массив, а не массив массивов - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу добавить массивы в массив следующим образом:

np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Тем не менее, когда я не выписываю массивы, но пытаюсь сделать что-то подобное

DataMatrix = np.array([])
dataArray = np.array([])
with open("fakedata.txt", "r") as file:
    for line in file.readlines():
        #f_list = [float(i) for i in line.split(" ") or i in line.split(", ") if i.strip()]
        rr = re.findall("[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?", line)
        dataArray=np.array([])
        for numbers in rr:
            if(numbers!=""):
                dataArray=np.append(dataArray,float(numbers))
        DataMatrix=np.append(DataMatrix,dataArray, axis=0)
print(DataMatrix)

это просто не будет работать. Он создаст один большой массив, а не массив массивов. Помещение лишних [] -кобок в любом месте не помогло. Каждый пример, который я нахожу, использует явные массивы, как показано выше, а не переменные.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

Вот скромная настройка вашего кода ответа. Без txt-файла я не могу его протестировать, но думаю, что это правильно:)

alist=[]
with open("fakedata.txt", "r") as file:
    for line in file.readlines():
        rr = re.findall("[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?", line)
        innerlist = [numbers in rr if numbers!=""]
        alist.append(innerlist)
np.array(alist, dtype=float)        

Я заменил для l oop на понимание списка; это в основном очистка syntacti c. И отложил преобразование до float, так что np.array может сделать это для всех строк «за раз».

В последнее время было несколько сообщений SO о добавлении в список по сравнению с добавлением в массив. Почти все согласны с тем, что список добавляется так, как это правильно. Повторное добавление / объединение массива неэффективно, и его трудно получить правильно. np.concatenate со списком довольно полезно; np.append следует (ИМО) исключить.

1 голос
/ 13 февраля 2020

Если ваш файл выглядит примерно так:

1e1 1e2 -1e3
2.4e5 4.5e6 1.8e1
-1.1 -0.6 1.11

Вы можете использовать np.loadtxt:

>>> import numpy as np
>>> import io
>>> matrix = """\
1e1 1e2 -1e3
2.4e5 4.5e6 1.8e1
-1.1 -0.6 1.11"""
>>> file = io.StringIO(matrix)
>>> np.loadtxt(file)
array([[ 1.00e+01,  1.00e+02, -1.00e+03],
       [ 2.40e+05,  4.50e+06,  1.80e+01],
       [-1.10e+00, -6.00e-01,  1.11e+00]])

В этом случае аргументы по умолчанию np.loadtxt будет работать, но если это не точный формат вашего файла, есть различные настройки, которые можно сделать. Чтобы передать ему имя файла напрямую, как в вашем случае вы можете использовать np.loadtxt('fakedata.txt') вместо этого.

0 голосов
/ 13 февраля 2020

Хорошо, единственный способ, которым я управляю, - это определить обычный массив (DataMatrix = [], а не DataMatrix = np.array ([])), а затем использовать np.array (array) в конце получите это в форме, которую я хочу:

DataMatrix=[]
with open("fakedata.txt", "r") as file:
    for line in file.readlines():
        rr = re.findall("[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?", line)
        dataArray=[]
        for numbers in rr:
            if(numbers!=""):
                dataArray.append(float(numbers))
        DataMatrix.append(dataArray)
np.array(DataMatrix)        
print(np.array(DataMatrix))

Учитывая, что я полный нуб программиста, это, вероятно, не самый умный способ сделать это. Но хорошо ... спасибо за понижение голосов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...