построить массив из списка кортежей - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу преобразовать список кортежей в массив numpy. Например:

items = [(1, 2), (3, 4)]

используя np.asarray(items) Я получаю:

array([[1, 2],
       [3, 4]])

но если я попытаюсь добавить элементы по отдельности:

new_array = np.empty(0)
for item in items:
    new_array = np.append(new_array, item)

new_array теряет первоначальную форму и становится:

array([1., 2., 3., 4.])

Я могу получить желаемую форму, используя new_array.reshape(2, 2):

array([[1., 2.],
       [3., 4.]])

но как бы мне получить эту форму без изменения формы?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Если у вас есть список кортежей, и вы решили, что ненавидите стандартные конструкторы массива (np.array, np.asarray и т. Д., Которые, как указывал @JohnZwinck, вероятно, являются лучшим ответом) по какой-то причине, наиболее эффективным подходом было бы предварительно выделить весь массив и затем присвоить ему:

items = [(1, 2), (3, 4)]
arr = np.empty((len(items), len(items[0])))

arr[...] = items

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

Таким образом, с учетом вышеупомянутого arr, при таком подходе наиболее эффективным способом добавления строки будет:

newitem = (5, 6)
oldarr = arr
arr = np.empty((oldarr.shape[0] + 1, *oldarr.shape[1:]))

arr[:-1,:] = oldarr
arr[-1,:] = newitem
0 голосов
/ 11 ноября 2018

Во-первых, необходимо указать правильную форму массива, чтобы numpy мог понять, как интерпретировать значения, предоставленные методу append.

Затем, чтобы предотвратить автоматическое выравнивание, укажите ось, к которой вы хотите добавить.

Этот код делает то, что вы намеревались сделать:

import numpy as np

items = [(1,2),(3,4)]

new_array = np.ndarray((0,2))
for item in items:
    new_array = np.append(new_array, [item], axis=0)

print(new_array) # [[1. 2.]
                 #  [3. 4.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...