Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用序列创建numpy数组_Python_Arrays_Numpy_Scipy_Sequence - Fatal编程技术网

Python 使用序列创建numpy数组

Python 使用序列创建numpy数组,python,arrays,numpy,scipy,sequence,Python,Arrays,Numpy,Scipy,Sequence,我正在从MATLAB过渡到scipy(+numpy)+matplotlib。我在执行某些事情时总是遇到问题。 我想在三个不同的部分创建一个简单的向量数组。在MATLAB中,我将执行以下操作: vector=[0.2,1:60,60.8]; a = np.hstack(([0.2],np.linspace(1,60,60),[60.8])) 这将产生62个位置的一维数组。我正在尝试使用scipy实现这一点。我现在最接近的是: a=[[0.2],linspace(1,60,60),[60.8]]

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

vector=[0.2,1:60,60.8];
a = np.hstack(([0.2],np.linspace(1,60,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。我知道如何访问数组中的位置,尽管在创建序列时不知道。 任何帮助都将不胜感激,
谢谢

您可以尝试以下方法:

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

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

a=np.array([0.2]+list(range(1,61))+[60.8])
但是可能有更好的方法…如果您使用的是Python2.X,
列表(范围(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
函数需要一个iterable,它是一个序列,或者是一个长度相同的序列。

arange(0.2,60.8,0.2)做什么

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

不知何故,我喜欢你提到的构建这些分段范围的想法。如果你经常使用它们,可能是一个小函数,比如

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来寻找答案。

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

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

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

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]
切片表示法按预期工作[开始:停止:步骤]:

尽管如果将的虚数用作第三个参数,切片表示法的行为类似于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])

否则,它的行为与arange类似:

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

我只想指出,对于其他从MATLAB到Numpy的人来说,你可以用冒号构造一个np.r_u数组,然后用它来索引

例如,如果您在matlab中有

arr_ones = ones(10,10)
还是在努比

arr_ones = np.ones([10,10])
在Matlab中,您可以只取第1列到第5列以及第7列,如下所示:

arr_ones(:,[1:5 7])
在Numpy中做同样的事情(至少对我来说)不是直观的。 这将给您一个“无效语法”错误:

然而,这是可行的:

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

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

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


该死,真的!谢谢你,拉斯曼。另外,每当我想做像a=[1:2:20]这样的事情时,linspace是唯一的选项吗?这意味着我不知道向量的最终大小,只知道步长和起点/终点。多亏了mgilson,我自己找到了它。answe在范围内(启动、停止、步进)。伟大的您也可以尝试
np.arange(1,20,2)
,但要小心,因为此操作不包括范围内的最后一个数字(例如数组([1,3,5,7,9,11,13,15,17,19])。我忘了Matlab是如何处理这个问题的,我早就把它从我的机器上删除了。很高兴知道!谢谢据我所知,MATLAB不断增加/减少,如果终点恰好在a=[0:2:10]的范围内,那么a包含它。但是,如果终点不包括在内,如a2=[1:2:10],则a2中不包括10。真!谢谢你,乔沙德尔。另外,每当我想做像a=[1:2:20]这样的事情时,linspace是唯一的选项吗?这意味着我不知道向量的最终大小,只知道步长和起点/终点。多亏了姆吉尔森,我自己才找到的。答案是范围(开始、停止、步进)。太好了@vint-i-vuit注意,python内置的range函数仅适用于整数值。Numpy提供了
arange
,它将执行相同的操作(如果您希望,也可以使用浮点)返回数组,但是文档指出
linspace
在大多数情况下是一个更好的选择,因为(由于舍入),来自
arange
的结果可能与您期望的不完全一样。@mgilson感谢您的深入了解。然而,我通常比linspace更需要range/arange的功能(我很少在MATLAB中使用linspace)。因为我倾向于实现知道步长而不是最终向量大小的数组。我会考虑的!伟大的米吉尔森!这可能是最接近MATLAB的语法。仍然没有a=[0.2,1:60,60.8]那么紧凑,但是很酷。非常感谢,我现在看得更清楚了。我想你会发现,虽然
numpy
中的许多内容与matlab中的一样简洁(还有一些内容稍微简洁),但也有不少内容不够简洁——不过,总的来说,我觉得代码更直观。据我所知,所获得的灵活性,特别是在绘图方面,到目前为止,语法的“不那么简洁”是非常值得的的确arange()是我将使用的函数