[英]What is the logical difference between the below two python for loops?
我有一个名为 circles 的 numpy 数组,其第三列由半径值组成
circles=[
1358 254 113
1630 282 89
994 132 108
1204 742 103
976 638 100
1696 500 119
1256 468 106
1434 642 119]
def get_radius(circles):
radii=[]
for coordinates in circles[0,:]:
radii.append(coordinates[2])
return radii
上面的 function 给了我 output
半径= [113, 89, 108, 103, 100, 119, 106, 119]
根据我的理解,下面的代码还应该提供上述半径值 [113, 89, 108, 103, 100, 119, 106, 119]
def get_radius(circles):
radii=[]
for coordinates in circles:
radii.append(coordinates[2])
return radii
但它提供半径=[994 132 108]
在第一个循环中,您实际上是在创建一个仅包含最后一列的新列表并对其进行迭代,这就是为什么结果
在第二个循环中,您将变量 circle 作为一个整体使用,因此当您遍历它时,它似乎只是将其视为一个 object,而您只是将其附加到第二列
至少这是我的理解
你拥有的数组是
circles = np.array(
[
[
[1358, 254, 113],
[1630, 282, 89],
[994, 132, 108],
[1204, 742, 103],
[976, 638, 100],
[1696, 500, 119],
[1256, 468, 106],
[1434, 642, 119]
]
]
)
print(circles.shape)
# Prints
# (1, 8, 3)
该数组具有三个维度,我们称它们为x 、 y 、 z 。
如果我们做circles[0,:]
,这将采用x的第一个元素(它只有一个元素,其他维度中的所有其他元素:
print(circles[0,:])
# Prints
# [[1358 254 113]
# [1630 282 89]
# [ 994 132 108]
# [1204 742 103]
# [ 976 638 100]
# [1696 500 119]
# [1256 468 106]
# [1434 642 119]]
所以现在,循环在这个数组中的每个coordinate
上进行迭代,即每个子数组y ,它采用第三个元素(索引为 2 的那个)。
在循环的第二个版本中,您开始遍历x的元素,但x只有一个元素,即数组 ( y , z ),然后您获取第三个元素,即第三行[ 994, 132, 108 ]
.
如果您在哪里简化原始数组以消除外部维度,这似乎是不必要的:
circles = circles[0,:]
print(circles.shape)
print(circles)
# Prints
# (8, 3)
# [[1358 254 113]
# [1630 282 89]
# [ 994 132 108]
# [1204 742 103]
# [ 976 638 100]
# [1696 500 119]
# [1256 468 106]
# [1434 642 119]]
您现在可以毫无问题地使用第二个 function
def get_radius(circles):
radii=[]
for coordinates in circles:
radii.append(coordinates[2])
return radii
print(get_radius(circles))
# Prints
# [113, 89, 108, 103, 100, 119, 106, 119]
因为现在循环遍历circles
的简化版本(每一行y )中的每个第一级元素并获取第三个元素。
Numpy arrays 可能会造成混淆,这是一个从检查shape
开始调试的好习惯。
除了IgnatiusReilly提供的解释之外,您还可以执行矢量化数组以获得相同的所需答案。
circles[0,:,2]
array([113, 89, 108, 103, 100, 119, 106, 119])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.