在 for 循环中删除和添加 numpy 数组行以从更大的 numpy 数组创建动态子数组,
Posted
技术标签:
【中文标题】在 for 循环中删除和添加 numpy 数组行以从更大的 numpy 数组创建动态子数组,【英文标题】:Deleting and adding numpy array rows in a for loop to create a dynamic subarray from larger numpy array, 【发布时间】:2022-01-15 23:08:35 【问题描述】:问题总结
终极目标
我想从一个大输入 numpy
数组中获取一个子数组。这个子数组是动态的,通过较大的numpy
输入数组的每次迭代都会改变子数组,这样我就可以执行一组依赖于数组先前迭代的计算。这涉及嵌套的 for 循环,我意识到这不是很 Python,但我不知道另一种方式。
问题
当我添加到现有的动态子数组时出现问题,它似乎增加了额外的括号。这似乎很容易解决,但我无法将我的 Matlab 数组索引知识调整为 numpy
索引。我什至还没有开始实现我的计算,但我似乎无法正确地得到这个循环的结构。
我尝试过的
我[最初在 Pandas 中尝试过这个][1]。最初,我认为我可以编写一个非常简单的程序来使用 pandas 索引和列命名来执行此操作。但它很慢!所以我试图通过
来简化这个-
改变架构和
依赖 numpy 而不是 Pandas。
下面是一个模拟我想做的简单程序。我相信我还会有其他问题,但这是开始。我有一个简单的 (5, 2) 数组,我循环遍历其中的行。对于第 0 行之后的每一行,我将新行添加到临时子数组的顶部并删除数组的最后一行,始终保持 (2, 2) 数组。但是,正如您在运行此代码时将看到的那样,它会导致一些奇怪的行为,从而导致无法将结果写入输出数组。您还将看到我尝试了几种添加和删除列的方法。这些是否是最优的并不重要——当前的代码是我运行这个程序最接近的!
一些示例代码
此代码“有效”是因为它不会引发错误。但是,它不会产生预期的结果。在这种情况下,它将是一个与输入具有相同值的输出数组(因为我没有进行任何计算——这只是为了让架构正确)。期望的结果是每个循环都按以下顺序创建一个子数组:
n=1 [1 1]
n=2 [[1,1], [2,2]]
n=3 [[2, 2], [3, 3]]
n=4 [[3, 3], [4, 4]]
...
N [[N-1, N-1], [N, N]].
这不需要限制为 2 个项目(如果是列表)或行(如果是数组),长度将由输入变量设置。因此,该数组的大小必须是动态的(在函数调用期间设置)。此外,我在这里提供了一个简单的示例,但每个循环基本上都需要从输入中添加一行。它将比简单的 2 成员 NDarray 更先进一些。列表具有能够使用 .append 和 .pop 属性的优势,但据我所知,数组没有。我仅使用数组来展示以下代码示例。
import numpy as np
a = np.array([[1, 1], [2, 2], [3, 3], [4,4], [5,5]])
print('Original a array: ', a)
out = np.empty_like(a)
b = np.empty(len(a[0,:]))
for ii, rr in enumerate(a):
if ii == 0:
c = [a[ii]]
else:
print('Before: ', c)
#Add next row from array a to the temp array for calculations
c = np.insert(c, 1, [rr], axis=0)
print('During: ', c)
#Remove the last row of the temp array prior to calculations
#indices_to_remove = [0]
#d = c[~np.isin(np.arange(c.size), [indices_to_remove])]
d = c[1::]
c = [d]
print('After: ', c)
#Add the temp array to the output array after calculations
#THIS THROWS ERRORS, AND I THINK IT IS DUE TO THE INCREASING NUMBERS OF BRACKETS.
#out[ii, :] = c
#print(c)
[1]: https://***.com/questions/70186681/nested-loops-altering-rows-in-pandas-avoiding-a-value-is-trying-to-be-set-on?noredirect=1#comment124076103_70186681
【问题讨论】:
没有“动态数组”这样的东西。什么 MATLAB 矩阵或动作是“动态的”? 考虑数组维度,shape
,而不是“括号数”。在 MATLAB 中,这是size
。将a[ii]
放入列表[a[ii]]
的目的是什么?还是[d]
?不要随意使用[]
!
【参考方案1】:
MATLAB 是 1 基索引,而 Python 使用 0 基索引。 假设我们有一个这样的二维数组:
a= [[1, 2],
[3, 4],
[5, 6]]
在 MATLAB 中,如果您执行 a(1, 1)
,您将在 python a[1, 1]
中获得 1
,您将获得 4。此外,正如您在 MATLAB 中所知道的,您可以进行自然索引,如果您在 python 中执行 a(6) = 6
这样做你会得到IndexError:
。几乎一样,只是在python中它是从0开始的。
这里是你想要的结果的工作示例。
import numpy as np
a = np.array([[1, 1], [2, 2], [3, 3], [4,4], [5,5]])
test = []
for idx in range(len(a)):
if idx == 0:
test.append(a[idx])
test.append(a[idx:idx+2, :])
# remove the last [5, 5]
test.pop(-1)
for i in test:
print(i, end=',\n')
输出
[1 1],
[[1 1]
[2 2]],
[[2 2]
[3 3]],
[[3 3]
[4 4]],
[[4 4]
[5 5]],
【讨论】:
这与我所追求的很接近,但它存在缺陷,因为您正在制作一个不断增长的列表。对于这个问题,我需要该列表(或数组)增长到一定大小,然后在添加新项目并为每次迭代删除最旧项目时保持该大小。我相信这在我上面的语法中并不清楚,我已经对其进行了编辑。输出应该是:``` n=0 [1 1] n=1 [[1 1], [2 2]] n=2 [[2 2], [3 3]] n=3 [[3 3 ], [4 4]] ... N [[N-1 N-1], [NN]] ``` 列表(或数组)的长度需要灵活。以上是关于在 for 循环中删除和添加 numpy 数组行以从更大的 numpy 数组创建动态子数组,的主要内容,如果未能解决你的问题,请参考以下文章
当步长大于1时,通过数组切片和numpy.diff替换python中的for循环
使用 matplotlib imshow 在 for 循环中显示 numpy 数组
如何使用 Python 多处理 Pool.map 在 for 循环中填充 numpy 数组
将数组的列作为向量执行“for循环”时,Cupy 比 numpy 慢