2015-11-23 5 views
0

У меня есть нп массив массивовNumpy добавить столбцы в массив массивов

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

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

делая это:

toAddValue = 22  
for l in allData: 
     newC = np.empty(len(l)) 
     newC.fill(toAddValue) 
     l = np.c_[l,newC] 

в allData не переодеваться.

ожидаемый результат:

allData = [[[ 1., 2., 3., 22.],[ 5., 5., 5., 22.]],[[ 4., 5., 6., 22.]],[[ 7., 8., 9., 22.]]] 

Я также выгода от вопроса, чтобы спросить, как я могу сохранить ссылку на l без потери того же указателя при выполнении l = np.c_[l,newC]?

+0

насчет 'numpy.column_stack'? – plonser

+0

@plonser это не просто добавление столбцов, но и отслеживание изменений в цикле (по переменной «l») в переменной allData – belas

+0

Сначала сделайте 'allData' список массивов. Попытка работать с массивом объекта dtype излишне сложна. второе использование индексации для ссылки на его элементы. – hpaulj

ответ

0

Если вы используете enumerate (или for i in range(A.shape[0])) вы можете заменить ith элемент A с новым массивом:

In [91]: A=np.array([[[1,2,3],[5,5,5]],[4,5,6],[7,8,9]]) 
In [92]: A 
Out[92]: array([[[1, 2, 3], [5, 5, 5]], [4, 5, 6], [7, 8, 9]], dtype=object) 
In [93]: for i,l in enumerate(A): 
    newC=np.empty(len(l)) 
    newC.fill(42) 
    A[i]=np.c_[l,newC] 
    ....:  
In [94]: A 
Out[94]: 
array([array([[ 1., 2., 3., 42.], 
     [ 5., 5., 5., 42.]]), 
     array([[ 4., 42.], 
     [ 5., 42.], 
     [ 6., 42.]]), 
     array([[ 7., 42.], 
     [ 8., 42.], 
     [ 9., 42.]])], dtype=object) 

Это не выглядит, как ваша цель, но это becaulse np.c_ работает на 2d первый элемент по-другому, чем на 1-й 2-й и 3-й.

Обратите внимание, что здесь A, работающий из вашего кода, представляет собой массив списков, с dtype = object. Но после итерации это массив массивов (это потому, что np.c_ преобразует списки в массивы, когда он выполняет конкатенацию).

Вот та же конструкция, но со списком списков

In [105]: Al=list(A) 
In [106]: Al 
Out[106]: [[[1, 2, 3], [5, 5, 5]], [4, 5, 6], [7, 8, 9]] 
In [107]: for i,l in enumerate(Al): 
    newC=np.empty(len(l)) 
    newC.fill(42) 
    Al[i]=np.c_[l,newC] 
    .....:  
In [108]: Al 
Out[108]: 
[array([[ 1., 2., 3., 42.], 
     [ 5., 5., 5., 42.]]), array([[ 4., 42.], 
     [ 5., 42.], 
     [ 6., 42.]]), array([[ 7., 42.], 
     [ 8., 42.], 
     [ 9., 42.]])] 
Смежные вопросы