将元素插入到 n 维数组的任意位置

Posted

技术标签:

【中文标题】将元素插入到 n 维数组的任意位置【英文标题】:Inserting element into arbitrary position of an n-dimensional array 【发布时间】:2016-11-03 08:44:19 【问题描述】:

我正在使用 Python 2.7 创建一个复值 (m x n) 维数组,该数组没有最初已知的固定大小(即 m 和 n 事先不知道),它将为特定元素分配不同的值。因此,我将更改现有元素或在将来指定的任意位置向该数组添加新元素。

一般来说,我想将一个指定大小的初始数组转换为 (m x n) 维数组。例如,如果我从

[ 0.+0.j  0.+0.j  0.+0.j]
[ 0.+0.j  0.+0.j  0.+0.j]

我想更新它以产生案例 1、案例 2 或案例 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]

案例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。(数组的最终必要大小要到代码末尾才能知道。)

任何关于能够以更有效的方式将空行或空列添加到初始数组的见解都会很棒。

【问题讨论】:

您可能根本不想为此使用数组。 NumPy 数组根本不是为这种用途而设计的。考虑使用字典或其他东西。 这就是我似乎正在阅读的内容。使用数组的主要原因是因为条目必须是复数值并用于进一步的数学运算。我可以将这些值分成一个实数和复杂的部分并创建两个单独的列表,但是仍然需要继续附加到这些列表并对这些元素执行操作(例如三角函数/双曲线函数、求幂、绘图)。 没有什么能阻止您将复数放入列表或字典中。 @user2357112 嗯,我会对每个列表做很多不同的运算,每个数学运算还需要我创建一个全新的列表,例如:new_list = [ x%num for x in old_list] 这难道不是计算上的吗?密集的?我觉得通过列表运行大量算术也会有点混乱,尽管这对于代码的运行时间来说是次要的。 【参考方案1】:

试试这个:

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)

【讨论】:

【参考方案2】:

我建议研究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 会更有用。

【讨论】:

以上是关于将元素插入到 n 维数组的任意位置的主要内容,如果未能解决你的问题,请参考以下文章

go 数组任意位置插入数字类型的元素

go 数组任意位置插入数字类型的元素

go 数组任意位置插入数字类型的元素

插入排序(Insertion Sort)

js中的数组Array----增加元素

如何将元素插入到特定位置的数组中?