2016-10-21 2 views
0

Я хочу добавить в Numpy массив (матрица) в массив через петлюкак добавить в Numpy матрицу в пустой Numpy массив

data=[[2 2 2] [3 3 3]] 
Weights=[[4 4 4] [4 4 4] [4 4 4]] 
All=np.array([]) 
for i in data: 
    #i=[2 2 2 ] #for example 
    h=i*Weights   
    #h=[[8 8 8][8 8 8][8 8 8]] 
    All=np.concatenate((All,h),axis=0)     

I ге эта ошибка:

ValueError: all the input arrays must have same number of dimensions 

I нужна переменная «Все», которая должна быть

[[8 8 8][8 8 8][8 8 8] [12 12 12][12 12 12][12 12 12]] 

Каким образом я могу добавить «h» в «Все» через петлю?

ответ

1

Вариант 1: Переформуйте ваш первоначальный All массив в 3 колонки так, что число столбцов соответствует h:

All=np.array([]).reshape((0,3)) 

for i in data: 
    h=i*Weights  
    All=np.concatenate((All,h)) 

All 
#array([[ 8., 8., 8.], 
#  [ 8., 8., 8.], 
#  [ 8., 8., 8.], 
#  [ 12., 12., 12.], 
#  [ 12., 12., 12.], 
#  [ 12., 12., 12.]]) 

Вариант 2: Используйте если-другое заявление обрабатывать начальное пустое случай массива:

All=np.array([]) 
for i in data: 
    h=i*Weights  
    if len(All) == 0: 
     All = h 
    else: 
     All=np.concatenate((All,h)) 

All 
#array([[ 8, 8, 8], 
#  [ 8, 8, 8], 
#  [ 8, 8, 8], 
#  [12, 12, 12], 
#  [12, 12, 12], 
#  [12, 12, 12]]) 

Вариант 3: Использование itertools.product():

import itertools 
np.array([i*j for i,j in itertools.product(data, Weights)]) 

#array([[ 8, 8, 8], 
#  [ 8, 8, 8], 
#  [ 8, 8, 8], 
#  [12, 12, 12], 
#  [12, 12, 12], 
#  [12, 12, 12]]) 
+0

Я попробовал второй вариант, он отлично работал и сделал цель. – Adam

+0

Я бы сказал, что попробовал третий вариант, но для меня это не очень понравилось – Adam

+0

Интересно. Возможно, ваши данные сложнее, чем вы показали, он дает желаемый результат как для python 2, так и для python 3 для меня. – Psidom

0

Адам, как насчет просто с помощью пары вложенных циклов? Я считаю, что этот код будет делать то, что вы хотите.

import numpy as np 
data = ([2,2,2],[3,3,3]) 
weights = ([4,4,4],[4,4,4],[4,4,4]) 

output=np.array([]) 
for each_array in data: 
    for weight in weights: 
      each_multiplication = np.multiply(each_array, weight) 
      output = np.append(output,each_multiplication) 

print output 

np.multiply() выполняет умножение элемента умножения вместо матричного умножения. Насколько я могу понять из вашего примера ввода и вывода, это то, что вы пытаетесь выполнить.

0

Возможно, это не лучшее решение, но оно работает.

data = np.array([[2, 2, 2], [3, 3, 3]]) 
Weights = np.array([[4, 4, 4], [4, 4, 4], [4, 4, 4]]) 
All = [] 

for i in data: 
    for j in Weights: 
     h = i * j 
     All.append(h) 

All = np.array(All) 

Я хотел бы сказать, что это не самое лучшее решение, потому что он добавляет результат в списке и в конце преобразует список в Numpy массиве, но он хорошо работает для небольших приложений. Я имею в виду, что если вам нужно делать такие тяжелые вычисления, я бы подумал о поиске другого метода. В любом случае с помощью этого метода вам не нужно думать о числовых преобразованиях с плавающей запятой. Надеюсь это поможет.

+0

Это широко используемый способ построения массива при необходимости петли. – hpaulj

+0

Да, я согласен. я имею в виду, если вы должны использовать это только для некоторых небольших вычислений, я думаю, что это может преуспеть, но оно медленнее, чем просто использование numpy и, безусловно, добавление массива на каждую итерацию - это то, чего следует избегать, если массив длинный. – Nensi601

0

Предпочтительный способ построения массива с помощью цикла является сбор значений в списке, а также выполнять concatenate один раз, в конце:

In [1025]: data 
Out[1025]: 
array([[2, 2, 2], 
     [3, 3, 3]]) 
In [1026]: Weights 
Out[1026]: 
array([[4, 4, 4], 
     [4, 4, 4], 
     [4, 4, 4]]) 

Append к списку гораздо быстрее, чем повторил concatenate; плюс это позволяет избежать «empty` вопроса формы массива:

In [1027]: alist=[] 
In [1028]: for row in data: 
     ...:  alist.append(row*Weights) 
In [1029]: alist 
Out[1029]: 
[array([[8, 8, 8], 
     [8, 8, 8], 
     [8, 8, 8]]), array([[12, 12, 12], 
     [12, 12, 12], 
     [12, 12, 12]])] 

In [1031]: np.concatenate(alist,axis=0) 
Out[1031]: 
array([[ 8, 8, 8], 
     [ 8, 8, 8], 
     [ 8, 8, 8], 
     [12, 12, 12], 
     [12, 12, 12], 
     [12, 12, 12]]) 

Вы также можете присоединиться к массивам на новом измерении с np.array или np.stack:

In [1032]: np.array(alist) 
Out[1032]: 
array([[[ 8, 8, 8], 
     [ 8, 8, 8], 
     [ 8, 8, 8]], 

     [[12, 12, 12], 
     [12, 12, 12], 
     [12, 12, 12]]]) 
In [1033]: _.shape 
Out[1033]: (2, 3, 3) 

Я могу построить эту 3d версию с простым эфиром не умножение - нет петель

In [1034]: data[:,None,:]*Weights[None,:,:] 
Out[1034]: 
array([[[ 8, 8, 8], 
     [ 8, 8, 8], 
     [ 8, 8, 8]], 

     [[12, 12, 12], 
     [12, 12, 12], 
     [12, 12, 12]]]) 

Добавить .reshape(-1,3) к тому, чтобы получить (6,3) версию.

np.repeat(data,3,axis=0)*np.tile(Weights,[2,1]) также производит желаемый массив 6x3.

Смежные вопросы