嵌套Python numpy数组维度混乱

嵌套Python numpy数组维度混乱,python,arrays,numpy,Python,Arrays,Numpy,假设我有一个numpy数组c,构造如下: a = np.zeros((2,4)) b = np.zeros((2,8)) c = np.array([a,b]) 我本以为c.shape是(2,1)或(2,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), a

假设我有一个numpy数组
c
,构造如下:

a = np.zeros((2,4))
b = np.zeros((2,8))
c = np.array([a,b])
我本以为
c.shape
(2,1)
(2,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数组,我需要访问对中的第一个数组,以便将1的列向量连接到它。我的应用程序是机器学习,我的数据将以所描述的格式呈现给我,但我需要在开始时修改数据,以便向其中添加偏差元素


编辑:我正在使用Python 2.7和Numpy 1.8.2

我相信您想要使用的是
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
的问题:这不能以明显的方式完成。串联意味着在另一个维度上彼此堆叠。您的数据彼此不匹配,但…

通常,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.]])

您的示例代码对我不起作用,我得到一个
ValueError:分配
c
时无法将输入数组从形状(2,4)广播到形状(2)
。为什么不直接使用
c=[a,b]
?可以使
c
成为对象dtype的数组,在其中可以存储任意形状的NumPy数组--
c=np.empty((2,),dtype='object')
c[:]=[a,b]
--,但是对象数组与普通的Python列表相比并没有任何速度优势。您可以将其用于NumPy切片语法,但我还没有看到一个引人注目的用例。顺便说一句,在NumPy v.1.9.0中,
np.array([a,b])
会引发Dux提到的相同的
ValueError
。如果您的一对中有两个NumPy数组,但它们的形状不同,则无法将它们组合到一个数组中。它们不合适。除非你使用HappelyAppSecond的解决方案如果我理解正确,
c=[a,b]
符合要求。这忽略了一个事实,即我基本上会有一个数组对数组,这是我的问题。这看起来像是另一种进行np.concatenate的方法,但我仍然需要按照我描述的方式完成访问数组的步骤。好吧,看来我还是不明白你的问题。你期望的输出是什么?二维数组,还是三维数组?@aconkey:你说,“我需要某种方法来获得一个数组(或列表)对”,这就是它给出的结果(无论如何,根据我的解释)。你能具体描述一下这个与你所说的“成对数组”不匹配的“成对数组”是什么吗?@tom10:OP想要
c[0]
返回
a
@HappyLeapSecond,这正是我在回答中遗漏的…:(“NumPy数组的嵌套NumPy数组不是很有用。”此注释不是很有用。有些库使用NumPy数组的嵌套NumPy数组,无法避免它们。