向量和矩阵,矩阵和张量与numpy ndarray之间的推广

时间:2015-10-10 07:39:20

标签: python numpy

我在比较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进行多次观察的矩阵。

有没有人有更好的解决方案?

2 个答案:

答案 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]