用序列创建的numpy数组

时间:2012-05-25 11:23:06

标签: python arrays numpy scipy sequence

我正在从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];
numpy。我知道如何访问数组中的位置,尽管不是在创建序列时。 任何帮助将不胜感激, 谢谢!

9 个答案:

答案 0 :(得分:15)

NumPy实现MATLAB的数组创建函数 vector ,使用两个函数而不是一个 - 每个函数隐式指定一个特定的轴 concatenation 应该发生。这些功能是:

  • 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])

答案 1 :(得分:5)

您可以尝试以下方式:

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

答案 2 :(得分:3)

np.concatenate([[.2], linspace(1,60,60), [60.8]])

答案 3 :(得分:3)

arange(0.2,60.8,0.2)能做你想做的吗?

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

答案 4 :(得分: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来寻找答案。

答案 5 :(得分: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函数需要一个迭代,它是一个序列,或者是一个长度相同的序列序列。

答案 6 :(得分:1)

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

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

vector = np.r_[0.2, 1:61, 60.8]

答案 7 :(得分: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中看起来很自然,我打赌很多人来到这个页面会想知道这个。 (我来到这里而不是问一个新问题。)

答案 8 :(得分:0)

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

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

np.r_[np.repeat(a,3),np.tile(a,3)]