我对我从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的数组创建功能, 载体 ,使用两个功能,而不是一个-每个隐式指定一个特定的轴,沿着该级联应该发生。 这些功能是:
因此,对于您的示例中,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