numpy的阵列的序列创建(numpy array creating with a sequence

2019-06-24 19:00发布

我对我从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的。 我知道该怎么做访问数组中的位置,创建一个序列虽然不是时候。 任何帮助将不胜感激,谢谢!

Answer 1:

井NumPy的实现MATLAB的数组创建功能, 载体 ,使用两个功能,而不是一个-每个隐式指定一个特定的轴,沿着该级联应该发生。 这些功能是:

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

符号按预期工作[ 启动:停止:步骤 ]:

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


否则,它像人气指数

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

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


Answer 2:

你可以尝试这样的:

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


Answer 3:

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


Answer 4:

难道arange(0.2,60.8,0.2)你想要什么?

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



Answer 5:

我有点喜欢你构建提到的这些分段范围的想法。 如果很多使用它们,也许一个小功能像

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.]

会是不错的。 虽然,我可能会去使用串连/ hstack答案。



Answer 6:

如果我理解正确的MATLAB,你可以做到这样的使用:

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

但也有可能是一个更好的办法...的list(range(1,61))可能只是range(1,61)如果你使用python 2.X.

这是通过创建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函数需要一个可迭代是一个序列,或者具有相同的长度序列的一个序列。



Answer 7:

看一看np.r_ 。 它基本上相当于什么其他人曾建议,但如果你从MATLAB来,它更直观一点(如果你从任何其他语言的到来,这是一个有点反直觉)。

作为一个例子, vector=[0.2,1:60,60.8]; 翻译为:

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


Answer 8:

只是想指出,任何其他人从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显得那么自然,我投注了很多的来到这个页面会想知道这个人。 (我来到这里,而不是提出一个新的问题。)



Answer 9:

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

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

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


文章来源: numpy array creating with a sequence