【发布时间】: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://stackoverflow.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]?不要随意使用[]!
标签: arrays python-3.x numpy for-loop