2016-05-12 5 views
-1

Я действительно не знаком с python, так что извините, если мой вопрос слишком прост. Предположим, что я имел 2d numpy массивзаполнение данных в многомерном массиве numpy

size = width, height 
array = np.zeros(size, dtype=np.uint8) 

Предположим, у меня есть 1d массив данных data_array, и я хочу, чтобы поместить данные в array переменной

for i in range(0,width-1): 
    for j in range(0,height-1): 
     array.append(data_array[i*rows+cols]) 

Но, кажется, не представляется возможным использовать Append для многомерных массивов ухабистого

+0

Вы не должны использовать Append на множестве numpy, потому что они статичны. –

+0

Заполнение и добавление двух операций. Используйте примерный пример и объясните, что вы ищете? – Divakar

+0

@ Divakar Я отредактировал мое сообщение. На самом деле, как предполагает цикл, у меня есть данные, хранящиеся в массиве 1d ('data_array'), я хочу поместить каждый из элементов' data_array' в массив 'numpy' – user1611830

ответ

1

Вы можете изменить свой массив 1D с

array=data_array.reshape(width, height) 
-

, если общий размер такой же

+0

спасибо и как лучше всего повлиять на данные этого массива в массив нулевых чисел? – user1611830

+0

Я думаю, что вы хотите сделать, это, внутри цикла: массив [I, J] = (data_array [я * строк + COLS]) но просто делать массив = data_array.reshape (ширина, высота) все это будет сделано автоматически без необходимости для циклов – Numlet

0

Если вам действительно нужно построить 2d элемент массива элементом здесь основной способ сделать это:

size=3,4 
A=np.zeros(size,int) 
for i in range(size[0]): 
    for j in range(size[1]): 
     A[i,j] = i*4 + j # assign elements, don't append 

производства

массив ([[0 , 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])

Но reshape я могу сделать то же самое, и быстрее

In [190]: x=np.arange(12) 

In [191]: x 
Out[191]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 

In [192]: x.reshape(3,4) # may want to add a .copy() 
Out[192]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

Другим распространенным способом построения массива является добавление в список и преобразование его в массив в конце циклов.

In [193]: alist=[]  
In [195]: for i in range(3): 
    .....:  ll = [] 
    .....:  for j in range(4): 
    .....:   ll.append(i*4+j) 
    .....:  alist.append(ll) 
    .....:  

In [196]: alist 
Out[196]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]] 

In [197]: np.array(alist) 
Out[197]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

Или в компактной форме списка понимания:

np.array([[i*4+j for j in range(4)] for i in range(3)]) 

Это может быть быстрее, если бы я мог выполнить это j итерации как массив

for i in range(3): 
    alist.append(i*4+np.arange(4)) 

еще лучше, если мы оба измерения этой путь

np.arange(3)[:,None]*4 + np.arange(4) 

Это использует термин «вещание», чтобы создать внешнюю продукцию из 2 массивов

In [209]: np.arange(3)*4, np.arange(4) 
Out[209]: (array([0, 4, 8]), array([0, 1, 2, 3])) 

Другой способ заполнить массив, чтобы присвоить «плоский» версии:

A.flat[:]=np.arange(1,13) 
Смежные вопросы