Python 使用序列创建numpy数组
我正在从MATLAB过渡到scipy(+numpy)+matplotlib。我在执行某些事情时总是遇到问题。 我想在三个不同的部分创建一个简单的向量数组。在MATLAB中,我将执行以下操作: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]]
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()是我将使用的函数