整洁,简单的公式来连接整数和ndarray

时间:2018-07-20 16:53:43

标签: python numpy

我目前正在从Matlab切换到Python,在Matlab中执行一个相当简单的操作在Python中似乎很棘手。

给予

<DatePicker type='date' value={moment(this.props.value)} />

我只找到这种方式来获得以下E:

A = array([0, 0, 0, 0])
B = 1
C = 2
D = array([3, 4])

在Matlab中,只需编写以下命令即可获得相同的E:

E = np.vstack((A, np.hstack((np.array([B, C]), D))))

有没有更简单的方法在Python中获得E?

2 个答案:

答案 0 :(得分:3)

作为一年多以前从MATLAB过渡到Python的人,您并不孤单地经历语法学习曲线。完成一些示例后,您就可以理解它了。

正如@abarnert在评论中提到的,只需完成操作即可实例化数组:

import numpy as np

A = np.array([0, 0, 0, 0])
B = 1
C = 2
D = np.array([3, 4])

然后您可以按以下方式构建输出矩阵:

E = np.matrix([A, [B, C, *D]])

哪个给:

[[0 0 0 0]
 [1 2 3 4]]

答案 1 :(得分:3)

由于numpy在Python中运行,因此无法自定义语法。

在八度音阶中:

>> A = [0,0,0,0];
>> B=1;
>> C=2;
>> D=[3,4];
>> E = [A; B,C,D]
E =
   0   0   0   0
   1   2   3   4

请注意,BC是(1,1)矩阵。 MATLAB没有真正的标量。

np.block具有一些相同的符号紧凑性:

In [183]: A = np.array([0, 0, 0, 0])
     ...: B = 1
     ...: C = 2
     ...: D = np.array([3, 4])
     ...: 
     ...: 
In [184]: np.block([[A],[B,C,D]])
Out[184]: 
array([[0, 0, 0, 0],
       [1, 2, 3, 4]])

在封面block下进行递归连接。

您的np.vstack([A, np.hstack((B,C,D))])也使用concatenate

hstack首先确保其所有输入至少为1d。因此必须将B(标量)转换为np.array(B)

In [195]: np.concatenate((np.array([B]),np.array([C]),D))
Out[195]: array([1, 2, 3, 4])

vstack确保其输入至少为2d。

In [197]: np.concatenate((A[None,:], Out[195][None,:]),axis=0)
Out[197]: 
array([[0, 0, 0, 0],
       [1, 2, 3, 4]])

MATLAB可能必须进行很多相同类型的转换(尽管本质上所有转换都是从2d开始的)。但是它使用了自己的语法解析器。


如果我们从2d数组开始,嵌套的连接会更简单:

In [198]: A = np.array([[0,0,0,0]])
In [199]: B = np.array([[1]])
In [200]: C = np.array([[2]])
In [201]: D = np.array([[3,4]])

In [203]: np.concatenate((A, np.concatenate((B,C,D),axis=1)), axis=0)
Out[203]: 
array([[0, 0, 0, 0],
       [1, 2, 3, 4]])

在另一个答案中指出,np.matrix子类是几年前提供的,它为numpy提供了一种具有固有2d数组和某些符号相似性的MATLAB感觉。


多玩一点,我发现我实际上不需要blocknp.matrixnp.array起作用:

In [222]: A = np.array([0, 0, 0, 0])
     ...: B = 1
     ...: C = 2
     ...: D = np.array([3, 4])
     ...: 
     ...: 
In [223]: np.array([A,[B,C,*D]])
Out[223]: 
array([[0, 0, 0, 0],
       [1, 2, 3, 4]])

*D是Python语法,对numpy来说不是特殊的东西:

In [224]: [B,C,*D]
Out[224]: [1, 2, 3, 4]
In [225]: [A,[B,C,*D]]
Out[225]: [array([0, 0, 0, 0]), [1, 2, 3, 4]]

np.array获取最后一个列表并将其转换为数组,与使用np.array([[0,0,0,0],[1,2,3,4]])相同。