Python numpy列数组和奇怪的结果

Python numpy列数组和奇怪的结果,python,arrays,numpy,Python,Arrays,Numpy,我试图编写一个函数,其中的参数是具有不同形状的数组。我在理解列数组和使我的函数适用于所有形状的数组时遇到一些困难,以下是我发现的问题: 转置: 如果参数数组A不是一个向量,那么我可以使用A.T很好地转换它,但是如果A是一个行向量,这不会将A转换为列向量。如果A是一个列向量,那么它将(奇怪地)变成一个行向量。有没有一种方法可以独立于阵列的形状进行转置 点产品 列向量与标量的点积就是列向量(yeahh!)。列向量与1元素numpy数组的点积是行向量(nayyy) 反转 linalg.inv(arra

我试图编写一个函数,其中的参数是具有不同形状的数组。我在理解列数组和使我的函数适用于所有形状的数组时遇到一些困难,以下是我发现的问题:

转置: 如果参数数组
A
不是一个向量,那么我可以使用
A.T
很好地转换它,但是如果
A
是一个行向量,这不会将
A
转换为列向量。如果
A
是一个列向量,那么它将(奇怪地)变成一个行向量。有没有一种方法可以独立于阵列的形状进行转置

点产品 列向量与标量的点积就是列向量(yeahh!)。列向量与1元素numpy数组的点积是行向量(nayyy)

反转

linalg.inv(array(2)) #gives an error, shouldn't it return 1/2 ?
谢谢你的帮助! 顺便说一句,对不起,我已经习惯了Matlab,这种书写方式让我很困惑。。
P.S.2我不想使用矩阵,因为数组更通用

如果你习惯了Matlab,Numpy处理“列”和“行”向量的方法有点奇怪。要了解的是,一维数组既不是列向量,也不是行向量。要成为列向量或行向量,数组必须是一维设置为1的二维数组。通过查看大括号的数量,可以区分一维数组和具有一行的二维数组之间的区别:

>>> a = numpy.arange(15)
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
>>> b = a.reshape(1, -1)
>>> b
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]])
现在您可以看到,当您转置这两个变量时,
a
保持不变,但
b
变为列向量:

>>> a.T
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
>>> b.T
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11],
       [12],
       [13],
       [14]])
同样,这似乎有点奇怪——但正如您所说,“数组更通用。”为了实现这种通用性,Numpy严格区分了不同维度的数组;一维数组不能是任何有意义的“列”或“行”向量。第二个维度根本没有定义

你的其他问题的答案来自于这个观察。上面的代码示例代码为我生成了一个错误,所以我将做一些稍微不同的事情。。。这也会产生一个错误,但信息量更大:

>>> A
array([[1],
       [2]])
>>> B
array([2, 4])
>>> numpy.dot(A, B)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: objects are not aligned
现在一切都有意义了。点在这里简单地执行矩阵乘法;一次操作产生一个2x2阵列;在另一种情况下,它生成1x1阵列。注意大括号的数量!这两种都是二维阵列。反过来,
10
[10]
[10]]
都将是不同的结果

同样,考虑这三个值:

>>> numpy.array(2)
array(2)
>>> numpy.array((2,))
array([2])
>>> numpy.array((2,)).reshape(1,-1)
array([[2]])
如果您将这些传递给
numpy.linalg.inv
,那么除了最后一个之外,您将得到所有错误——您不能对非矩阵的对象进行矩阵求逆!如果通过最后一个,结果也是一个矩阵:

>>> numpy.linalg.inv(numpy.array((2,)).reshape(1,-1))
array([[ 0.5]])
换位 区分一维阵列和二维阵列很重要。您所指的行向量是1D,而列向量是2D。为了说明差异,请看下面的示例

首先,我们演示转置2D数组的默认行为(即使列向量是简单的2D数组):

正如预期的那样,输出为:

(4, 3)
(1, 3)
但是,一维向量不会改变其大小:

print np.ones((3,)).T.shape
输出:

(3,)
(1, 3)
[[ 1.]
 [ 1.]]
[[ 0.5]]
要将其快速转换为二维数组,请使用
[:,None]

print np.ones((3,))[:,None].T.shape
输出:

(3,)
(1, 3)
[[ 1.]
 [ 1.]]
[[ 0.5]]
点积 要获得所需的结果,应更好地使用二维阵列:

A = np.ones((2, 1)     # column vector
b = np.ones((1, 1))    # scalar
print np.dot(A, b)     # column vector (as expected)
输出:

(3,)
(1, 3)
[[ 1.]
 [ 1.]]
[[ 0.5]]
是的!:)

反转 同样,您需要确保使用二维阵列。这可以使用
ndmin
参数完成:

print np.linalg.inv(np.array(2,ndmin=2))
输出:

(3,)
(1, 3)
[[ 1.]
 [ 1.]]
[[ 0.5]]

现在一切都变得非常合理了。非常感谢你