Python嵌套的numpy数组维度混淆

6
假设我有一个NumPy数组c,构造如下:
a = np.zeros((2,4))
b = np.zeros((2,8))
c = np.array([a,b])

我原本期望c.shape(2,1)(2,),但实际上它是(2,2)。另外,我的目标是将一个全为1的列向量连接到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数组组成的对列表或数组,并且我需要访问每一对中的第一个数组以便将一个列向量被连接到它上面。我的应用是机器学习,我的数据将以描述的格式传递给我,但是我需要在开始时修改数据,以添加偏置元素。 编辑: 我正在使用Python 2.7和Numpy 1.8.2

4
您的示例代码对我无效,当分配变量“c”时,我遇到了一个“ValueError: could not broadcast input array from shape (2,4) into shape (2)” 的错误提示。请您检查一下代码。 - Dux
1
为什么不直接使用 c = [a,b]?可以将 c 设为对象数据类型的数组,其中可以存储任意形状的 NumPy 数组 -- c = np.empty((2,), dtype='object'); c[:] = [a,b]-- ,但是对象数组与普通的 Python 列表相比没有任何速度优势。你可能会用它来进行 NumPy 切片语法,但我还没有看到过一个令人信服的用例。 - unutbu
1
顺便说一下,使用NumPy v.1.9.0时,np.array([a,b])会引发与Dux提到的相同的ValueError异常。 - unutbu
1
如果您有一对具有不同形状的两个numpy数组,则无法将它们合并为一个数组。它们大小不匹配。除非您使用HappyLeapSecond的解决方案。 - Dux
1
如果我理解正确的话,c = [a, b] 就符合要求。 - unutbu
显示剩余7条评论
2个回答

5
我相信你想要使用的是 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.]]

关于您合并ab的问题:这不能以一种明显的方式完成。连接意味着在一个额外的维度上堆叠在彼此之上。然而,您的数据并不适合互相堆叠...


这不考虑我的实际情况,我基本上会有一堆数组对的数组,这就是我的问题所在。这看起来像是另一种执行np.concatenate的方法,但我仍然需要按照我描述的方式访问数组的步骤。 - adamconkey
好的,看来我最终还是没有理解你的问题。你想要什么样的输出?一个二维数组还是一个三维数组? - Dux
@aconkey:你说:“我需要一种方法来拥有一组成对的数组(或列表)”,而这正是它所提供的(至少按我的理解)。 你能具体描述一下,这个“成对数组”有什么地方不符合你所说的“成对数组”的含义吗? - tom10
1
@tom10:OP 希望 c[0] 返回 a - unutbu

4
一般来说,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.]])

2
“嵌套的NumPy数组并不是很有用。”这条注释并不是很有用。一些库使用嵌套的NumPy数组,而无法避免它们的存在。 - user124384

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接