我正在使用Python 2.7创建一个复数值(m x n)维数组而没有最初已知的固定大小(即m和n未提前知道),这将为特定元素分配不同的值。因此,我将在将来指定的任意位置更改现有元素或向此数组添加新元素。
通常,我想将规定大小的初始数组转换为(m×n)维数组。例如,如果我以
开头[ 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j]
我想更新它以产生案例1,案例2或案例3(我决定选择哪一个)。基本上,我想要做的就是在初始数组中添加零行或列(或两者)。
案例1:
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
案例2:
[ 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j]
案例3:
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
当使用与上面类似的方法但使用np.insert时,我可以重现我想要的:
import numpy as np
T = np.zeros((2,3),dtype=np.complex_)
T = np.insert(T,len(T[0]),1,axis = 1)
或
T = np.zeros((2,3),dtype=np.complex_)
T = np.insert(T,len(T[:,0]),1,axis = 0)
使用这种方法,我可以玩到实现案例1,2或3,但是有没有特别有效的方法?
再次,约束是必须使用具有复杂类型元素的对象,因为这些条目将用于进一步的算术。我可以分离元素的真实和复杂部分并创建另外两个列表,但仍需要对它们应用数学运算。此外,最终数组可能具有m和n(大大)超过1000的值。(在代码结束之前,数组的最终必要大小将不可知。)
能够以更有效的方式将空行或列添加到初始数组的任何见解都会很棒。
答案 0 :(得分:0)
试试这个:
np.concatenate((T, np.zeros((1,T.shape[1]), dtype=np.complex_)), axis=0)
和
np.concatenate((T, np.zeros((T.shape[0],1), dtype=np.complex_)), axis=1)
答案 1 :(得分:0)
我建议研究np.insert
的代码。这是Python。如果它很复杂,那只是因为它试图通用,处理行或列等。
基本思想是创建一个大小正确的新结果数组,然后将值块从原始值复制到结果中。在1d,这将是:
z = np.zeros(x.shape[0]+1, dtype=x.dtype)
z[:i] = x[:i]
z[i+1:] = x[i:]
可以很容易地推广到在2d中添加一行(z[:i,...]
可能就是所需要的)。
要添加列和行,我可以想象复制4个块。
也可以使用连接(在编译代码中执行类似的块复制)。
np.concatenate([x[:i],np.array([0]), x[i:]])
np.insert
可能更容易使用,但不管怎样,你最终会做这种块副本。
现在,如果您只想添加行或列(或两者),则可以使用np.pad
。这是非常通用的,允许在每个维度的前端和末端添加。如果要在数组中间的某处添加新值,np.insert
会更有用。