Создайте динамический двумерный массив на лету - PullRequest
5 голосов
/ 19 марта 2012

Мне трудно создать массив numpy 2D на лету.

Так что в основном у меня есть цикл for что-то вроде этого.

for ele in huge_list_of_lists:
   instance = np.array(ele) 

создает 1-мерный массив из этого списка, и теперь я хочу добавить его в массив с массивами, так что, в основном, преобразовывать список списков в массив массивов?

Я проверил ручные .. и np.append() методы, которые не работают, так как np.append() работает, ему нужно два аргумента, чтобы добавить его вместе.

Есть какие-нибудь подсказки?

Ответы [ 3 ]

6 голосов
/ 19 марта 2012

Создайте двумерный массив заранее и заполните строки во время цикла:

my_array = numpy.empty((len(huge_list_of_lists), row_length))
for i, x in enumerate(huge_list_of_lists):
    my_array[i] = create_row(x)

где create_row() возвращает список или массив 1D NumPy длиной row_length.

В зависимости от того, что делает create_row(), могут быть даже лучшие подходы, которые вообще избегают цикла Python.

4 голосов
/ 19 марта 2012

Просто передайте список списков на numpy.array, имейте в виду, что numpy-массивы равны ndarrays, поэтому концепция списка списков не переводится в массивы массивов, а в 2d-массив.

>>> import numpy as np
>>> a = [[1., 2., 3.], [4., 5., 6.]]
>>> b = np.array(a)
>>> b
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
>>> b.shape
(2, 3)

Также у ndarrays есть nd-indexing, поэтому [1][1] становится [1, 1] в numpy:

>>> a[1][1]
5.0
>>> b[1, 1]
5.0

Я неправильно понял ваш вопрос?

Вы демонстративно не делаетехочу использовать numpy.append для чего-то подобного.Имейте в виду, что numpy.append имеет время выполнения O (n), поэтому, если вы вызовете его n раз, один раз для каждой строки вашего массива, вы получите алгоритм O (n ^ 2).Если вам нужно создать массив до того, как вы узнаете, каким будет весь контент, но вы знаете окончательный размер, лучше создать массив с помощью numpy.zeros(shape, dtype) и заполнить его позже.Аналогично ответу Свена.

2 голосов
/ 02 июня 2017

import numpy as np

ss = np.ndarray(shape=(3,3), dtype=int);

array([[              0, 139911262763080, 139911320845424],
   [       10771584,        10771584, 139911271110728],
   [139911320994680, 139911206874808,              80]]) #random

Функция numpy.ndarray достигает этого. numpy.ndarray

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