我正在尝试将我已经构建到python环境中的一些Matlab库。到目前为止,我面临的最大问题是基于索引规范的数组动态分配。例如,使用MATLAB,键入以下内容:Python动态数组分配,Matlab风格
x = [1 2];
x(5) = 3;
会导致:
x = [ 1 2 0 0 3]
换句话说,我没有事先知道的(X),还是其内容的大小。数组必须根据我提供的索引实时定义。
在Python中,尝试以下操作:
from numpy import *
x = array([1,2])
x[4] = 3
会导致以下错误:IndexError:索引越界。在变通办法增加阵列中的循环,然后分配所需的值:
from numpy import *
x = array([1,2])
idx = 4
for i in range(size(x),idx+1):
x = append(x,0)
x[idx] = 3
print x
它的工作原理,但它是不是很方便,它有可能成为n维arrays.I虽然有关子类ndarray非常繁琐实现我的目标,但我不确定它是否会起作用。有人知道更好的方法吗?
感谢您的快速回复。我不知道有关setitem方法(我对Python相当新)。我简单地覆盖了ndarray类如下:
import numpy as np
class marray(np.ndarray):
def __setitem__(self, key, value):
# Array properties
nDim = np.ndim(self)
dims = list(np.shape(self))
# Requested Index
if type(key)==int: key=key,
nDim_rq = len(key)
dims_rq = list(key)
for i in range(nDim_rq): dims_rq[i]+=1
# Provided indices match current array number of dimensions
if nDim_rq==nDim:
# Define new dimensions
newdims = []
for iDim in range(nDim):
v = max([dims[iDim],dims_rq[iDim]])
newdims.append(v)
# Resize if necessary
if newdims != dims:
self.resize(newdims,refcheck=False)
return super(marray, self).__setitem__(key, value)
它的作品就像一个魅力!但是,我需要修改上面的代码,使得setitem允许改变维数以下这个请求:
a = marray([0,0])
a[3,1,0] = 0
不幸的是,当我尝试使用这种numpy的功能
self = np.expand_dims(self,2)
返回的类型是numpy.ndarray而不是主要 .marray。任何想法,如果我可以强制执行那些numpy函数输出marray如果提供marray作为输入?我认为这应该是可行的使用array_wrap,但我永远无法找到如何。任何帮助,将不胜感激。
你'append'-IN-循环算法需要二次方时间,所以对于大型数组来说它会变得非常慢。 – 2012-07-13 14:44:25
把它作为一个机会来摆脱所有的特定数组重新分配;) – sebastian 2013-11-14 14:49:24
a)如果你不打算有稀疏值,即你想要顺序设置它们,你可以像np.fromiter一样。 b)如果你仍然打算使用子类ndarray,这篇文章应该清楚为什么这个类型不被保留,以及如何修复它http://docs.scipy.org/doc/numpy-1.10.1/user/basics.subclassing .html – Erik 2016-06-19 19:59:32