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