2015-07-18 3 views
2

Предположим, что у меня есть NumPy массив c построен следующим образом:вложенными Python Numpy массивы размерности путаница

a = np.zeros((2,4)) 
b = np.zeros((2,8)) 
c = np.array([a,b]) 

я ожидал бы c.shape быть (2,1) или (2,), но вместо этого он (2,2). Кроме того, что я хочу сделать, это сцепить вектор-столбец из единиц на a, но доступ к нему через c следующим образом:

c0 = c[0] # I would have expected this to be 'a' 
np.concatenate((np.ones((c0.shape[0], 1)), c0), axis=1) 

Это, конечно, не работает, потому что c[0] не равна a, как я ожидается, и я получаю

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

мне нужен какой-то способ, чтобы иметь массив (или список) пар, каждый компонент пары будучи в Numpy массив, и мне нужно, чтобы получить доступ к первому массив в паре, чтобы сцепить вектор столбца единиц к нему. Мое приложение - машинное обучение, и мои данные будут поступать ко мне в описанном формате, но мне нужно изменить данные в начале, чтобы добавить к нему элемент смещения.

EDIT: Я использую Python 2.7 и Numpy 1.8.2

+3

Ваш пример кода для меня не работает, я получаю значение ValueError: не удалось передать входной массив из формы (2,4) в форму (2) 'w назначая 'c'. – Dux

+0

Я использую Python 2.7, разве это может быть разница? – aconkey

+0

Я тоже использую Python 2.7. Я считаю, что нашел ответ, хотя бы, если бы я понял ваш вопрос правильно ... – Dux

ответ

2

Как правило, вложенные массивы NumPy массивов NumPy не очень полезны. Если вы используете NumPy для скорости, обычно лучше придерживаться массивов NumPy с однородным базовым цифровым типом.

Чтобы разместить два элемента в структуре данных, такие, что c[0] возвращает первый элемент, и c[1] второго, список (или кортеж), такие как c = [a, b] будет делать.


Кстати, если вы используете statemodels пакет, то вы можете добавить постоянную колонку с sm.add_constant:

import numpy as np 
import statsmodels.api as sm 

a = np.random.randint(10, size=(2,4)) 
print(a) 
# [[2 3 9 6] 
# [0 2 1 1]] 
print(sm.add_constant(a)) 
[[ 1. 2. 3. 9. 6.] 
[ 1. 0. 2. 1. 1.]] 

Однако обратите внимание, что не если a уже содержит постоянную колонку, без дополнительной колонки добавлен:

In [126]: sm.add_constant(np.zeros((2,4))) 
Out[126]: 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 
+0

«Вложенные массивы NumPy массивов NumPy не очень полезны». Этот комментарий не очень полезен. В некоторых библиотеках используются вложенные массивы NumPy NumPy массивов, и их не избежать. – user124384

1

Я считаю, что вы хотите использовать hstack:

a = np.zeros((2,4)) # 4 column vectors of length 2 
b = np.ones((2,1)) # 1 column vector of length 2 

c = np.hstack((a, b)) 
print c 
# [[ 0. 0. 0. 0. 1.] 
# [ 0. 0. 0. 0. 1.]] 

Что касается проблемы конкатенации ваш a и b: Это не может быть сделано очевидным образом. Конкатенация означает укладку поверх друг друга в дополнительном измерении. Ваши данные не подходят друг другу, хотя ...

+0

Это игнорирует тот факт, что у меня будет по существу массив пар массивов, хотя это и моя проблема. Это похоже на другой способ сделать np.concatenate, но мне все же нужно пройти через шаги доступа к массиву описанным образом. – aconkey

+0

Хорошо, кажется, я не понял ваш вопрос в конце концов. Каков ваш желаемый результат? Двумерный массив или трехмерный? – Dux

+0

@aconkey: вы говорите: «Мне нужно каким-то образом иметь массив (или список) пар», что и дает (по моей интерпретации, так или иначе). Не могли бы вы конкретно описать, что это такое «массив пар», который не соответствует тому, что вы подразумеваете под «массивом пар»? – tom10

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