1 回答
TA贡献1827条经验 获得超9个赞
我没有这个graphics包(它可能是特定于 Windows 的东西?),但我知道你让这个 waaaaay 太复杂了。这是一个更简单的版本,它生成相同的done数组:
from graphics import *
import numpy as np
# starting array
startArray = np.array([[2, 1, 2, 3, 4, 7],
[5, 4, 8, 3, 7, 8]])
# searching for duplicate (y) values and removing that row so the corresponding (x) is removed too.
done = startArray.T[np.unique(startArray[1,:], return_index=True)[1]]
for x,y in done:
print("this is x,y:", x, y)
print("this is y:", y)
rect = Rectangle(Point(x,y),Point(x+4,y+4))
rect.draw(win)
请注意,在上面的版本done.shape==(5, 2)中(2, 5),而不是,但您始终可以在for循环后使用 将其更改回来done = done.T。
以下是有关原始代码的一些注释,以供将来参考:
该order旗reshape完全是多余的,以你的代码试图做的,只是使它更加混乱/可能更马车。没有它,你可以做所有你想做的重塑。
for 的用例nditer是一次迭代一个(或多个)数组的各个元素。它通常不能用于迭代二维数组的行或列。如果您尝试以这种方式使用它,您可能会得到高度依赖于内存中数组布局的错误结果(如您所见)。
要迭代二维数组的行或列,只需使用简单的迭代。如果你只是遍历一个数组(例如for row in arr:),你会得到每一行,一次一个。如果你想要列,你可以先转置数组(就像我在上面的代码中所做的那样.T)。
注意事项 .T
.T接受数组的转置。例如,如果您从
arr = np.array([[0, 1, 2, 3],
[4, 5, 6, 7]])
那么转置是:
arr.T==np.array([[0, 4],
[1, 5],
[2, 6],
[3, 7]])
添加回答
举报