我在比较MATLAB和numpy时发现了一件有趣的事情。
MATLAB:
x = [1, 2]
n = size(X, 2)
% n = 1
Python:
x = np.array([1, 2])
n = x.shape[1]
# error
问题是:如何处理ndarray with shape(n,)和ndarray with shape(n,m)的输入。
e.g。
def my_summation(X):
"""
X : ndarray
each column of X is an observation.
"""
# my solution for ndarray shape (n,)
# if X.ndim == 1:
# X = X.reshape((-1, 1))
num_of_sample = X.shape[1]
sum = np.zeros(X.shape[0])
for i in range(num_of_sample):
sum = sum + X[:, i]
return sum
a = np.array([[1, 2], [3, 4]])
b = np.array([1, 2])
print my_summation(a)
print my_summation(b)
我的解决方案是强制ndarray形状(n,)成形(n,1)。
总和用作示例。我想要的是找到一种优雅的方法来处理矩阵的可能性,只使用一个观察(向量)和使用ndarray进行多次观察的矩阵。
有没有人有更好的解决方案?
答案 0 :(得分:1)
在ndarray X
中,len(X)
将沿第一个轴的元素数量。因此,对于2D数组,它将是行数,对于1D数组,它将是元素本身的数量。此属性可用于将可能是1D或2D数组的输入数组重新整形为2D数组输出。对于作为输入的1D阵列,输出2D阵列将具有与元素数量相同的行数。对于2D数组输入的情况,它的行数与以前相同,因此不会有任何变化。
总而言之,一种解决方案是将重塑代码放在函数定义的顶部,如下所示 -
X = X.reshape(len(X),-1)
样品运行 -
2D案例:
In [50]: X
Out[50]:
array([[6, 7, 8, 1],
[6, 2, 3, 0],
[5, 1, 8, 6]])
In [51]: X.reshape(len(X),-1)
Out[51]:
array([[6, 7, 8, 1],
[6, 2, 3, 0],
[5, 1, 8, 6]])
1D案例:
In [53]: X
Out[53]: array([2, 5, 2])
In [54]: X.reshape(len(X),-1)
Out[54]:
array([[2],
[5],
[2]])
答案 1 :(得分:1)
我最近从Python控件中了解了numpy.atleast_2d
工具箱。您也不需要for循环进行求和,而是使用
numpy.sum
。
import numpy as np
def my_summation(X):
"""
X : ndarray
each column of X is an observation.
"""
# my solution for ndarray shape (n,)
# if X.ndim == 1:
# X = X.reshape((-1, 1))
X = np.atleast_2d(X)
return np.sum(X, axis=1)
a = np.array([[1, 2], [3, 4]])
b = np.array([1, 2])
print my_summation(a)
print my_summation(b)
给出
[3 7]
[3]