17

我正在从 MATLAB 过渡到 scipy(+numpy)+matplotlib。在实施某些事情时,我一直遇到问题。我想在三个不同的部分创建一个简单的向量数组。在 MATLAB 中,我会执行以下操作:

vector=[0.2,1:60,60.8];

这会产生一个 62 个位置的一维数组。我正在尝试使用 scipy 来实现这一点。我现在最接近的是:

a=[[0.2],linspace(1,60,60),[60.8]]

但是,这会创建一个列表,而不是数组,因此我无法将其重塑为向量数组。但是,当我这样做时,我得到一个错误

a=array([[0.2],linspace(1,60,60),[60.8]])
ValueError: setting an array element with a sequence.

我相信我的主要障碍是我不知道如何在 MATLAB 中翻译这个简单的操作:

a=[1:2:20];

麻木。我知道如何访问数组中的位置,尽管在创建序列时不知道。任何帮助将不胜感激,谢谢!

4

9 回答 9

16

NumPy使用两个函数而不是一个函数来实现 MATLAB 的数组创建函数vector ——每个函数都隐含地指定了一个特定的轴,应该沿着该轴进行连接。这些功能是:

  • r_(逐行连接)和

  • c_(按列)


因此,对于您的示例,NumPy 等价物是:

>>> import numpy as NP

>>> v = NP.r_[.2, 1:10, 60.8]

>>> print(v)
     [  0.2   1.    2.    3.    4.    5.    6.    7.    8.    9.   60.8]

逐列对应的是:

>>> NP.c_[.2, 1:10, 60.8]

切片符号按预期工作 [ start:stop:step ]:

>>> v = NP.r_[.2, 1:25:7, 60.8]

>>> v
  array([  0.2,   1. ,   8. ,  15. ,  22. ,  60.8])

尽管如果将虚数用作第三个参数,切片符号的行为类似于linspace

>>> v = NP.r_[.2, 1:25:7j, 60.8]

>>> v
  array([  0.2,   1. ,   5. ,   9. ,  13. ,  17. ,  21. ,  25. ,  60.8])


否则,它的行为类似于arange

>>> v = NP.r_[.2, 1:25:7, 60.8]

>>> v
  array([  0.2,   1. ,   8. ,  15. ,  22. ,  60.8])
于 2012-05-26T11:11:37.520 回答
5

您可以尝试以下方法:

a = np.hstack(([0.2],np.linspace(1,60,60),[60.8]))
于 2012-05-25T11:31:35.803 回答
3

Does arange(0.2,60.8,0.2) do what you want?

http://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html

于 2012-05-25T11:57:13.850 回答
3
np.concatenate([[.2], linspace(1,60,60), [60.8]])
于 2012-05-25T11:32:36.720 回答
2

我以某种方式喜欢构建您提到的这些分段范围的想法。如果你经常使用它们,也许是一个小功能,比如

import numpy as np

def segrange(*args):
    result = []
    for arg in args:
        if hasattr(arg,'__iter__'):
            result.append(range(*arg))
        else:
            result.append([arg])
    return np.concatenate(result)

这给了你

>>> segrange(1., (2,5), (5,10,2))
[ 1.  2.  3.  4.  5.  7.  9.]

会很高兴。虽然,我可能会使用 concatenate/hstack 来寻找答案。

于 2012-05-25T12:20:51.070 回答
1

如果我正确理解 matlab,您可以使用以下方法完成类似的操作:

a=np.array([0.2]+list(range(1,61))+[60.8])

但可能有更好的方法......如果您使用的是 python 2.X ,则list(range(1,61))可能是这样。range(1,61)

这通过创建 3 个列表然后使用+运算符连接它们来工作。

你最初的尝试没有成功的原因是因为

a=[ [0.2], np.linspace(1,60,60), [60.8] ]创建一个列表列表——换句话说:

a[0] == [0.2] #another list (length 1)
a[1] == np.linspace(1,60,60) #an array (length 60)
a[2] == [60.8] #another list (length 1)

array函数需要一个可迭代的序列,或具有相同长度的序列序列。

于 2012-05-25T11:31:54.430 回答
1

看看np.r_。它基本上等同于其他人的建议,但如果你来自 matlab,它会更直观(如果你来自任何其他语言,它有点违反直觉)。

例如,vector=[0.2,1:60,60.8];转换为:

vector = np.r_[0.2, 1:61, 60.8]
于 2012-05-25T20:11:26.243 回答
1

只是想指出从 MATLAB 到 Numpy 的任何其他人,您可以构造一个带有冒号的 np.r_ 数组,然后用它来索引

例如,如果你在 matlab

arr_ones = ones(10,10)

或者在 Numpy 中

arr_ones = np.ones([10,10])

您可以在 Matlab 中只使用第 1 到第 5 列以及第 7 列,如下所示:

arr_ones(:,[1:5 7])

在 Numpy 中做同样的事情并不(至少对我而言)直观。这会给你一个“无效的语法”错误:

arr_ones[:,[1:5,7]]

但是,这有效:

inds = np.r[1:5,]
arr_ones[:,inds]

我知道这在技术上并不是一个新的答案,但是在 Matlab 中索引矩阵时使用冒号构造数组似乎很自然,我打赌很多来到这个页面的人都会想知道这一点。(我来这里而不是问一个新问题。)

于 2016-01-13T06:07:25.767 回答
0

使用 numpy.repeat() 的最简单方法 ||| numpy.tile()

a = np.array([1,2,3,4,5])

np.r_[np.repeat(a,3),np.tile(a,3)]
于 2019-05-04T02:26:48.883 回答