我想绘制的是从高值到低值的向量。如果代码将从:
a = [[1, 8, 9, 10],[2, 15, 3, -1],[3,1,6,11],[13,15,5,-2]]
X,Y = np.meshgrid(np.arange(4), np.arange(4))
U = ?
V = ?
从这一点来说,我应该设置U
和V
分量的向量。每个点的大小为a[x][y]
。我不太了解如何在每个网格点设置U
和V
制作从高值到低值的箭头。
这是一个解决方案(不需要numpy):
import itertools as it
a = [[1, 8, 9, 10],[2, 15, 3, -1],[3,1,6,11],[13,15,5,-2]]
rowSize = len(a[0])
maxVal = a[0][0]
maxIndex = 0
minVal = a[0][0]
minIndex = 0
for k, v in enumerate(it.chain(*a)): # Loop through a flattened list of the values in the array, and locate the indices of the max and min values.
if v > maxVal:
maxVal = v
maxIndex = k
if v < minVal:
minVal = v
minIndex = k
U = (minIndex % rowSize) - (maxIndex % rowSize)
V = (minIndex / rowSize) - (maxIndex / rowSize)
print U, ",", V
2 , 2
请注意,当有两个相等的最大值时,您还没有定义您想要的行为,就像您的示例中那样。上面的代码使用“第一个”(最左上角)作为真正的最大值,并忽略所有其他。
我将列表展平(这意味着我像阅读书中的文字一样阅读这些值 - 首先是第一行,然后是第二行,然后是第三行)。每个值都有一个索引,如下所示:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
例如,第二行和第三列中的值将获得索引 6,因为如果您像阅读书籍一样阅读数组,它是第 7 个值。
最后,当我们找到最大值或最小值的索引时,我们需要从一维索引中获取二维坐标。因此,我们可以使用 mod 运算符 (%) 来获取 x 值。
例如6 % 4 = 2
,,所以X = 2
(第 3 列)
要获得 Y 值,我们使用整数除法运算符 (/)。
例如6 / 4 = 1
,,所以Y = 1
(第二行)
U
和的公式V
只是取最大值和最小值的 X 和 Y 值并减去它们以获得矢量坐标,如下所示:
U = xMin - xMax
V = yMin - yMax
如果您想知道,“他为什么不直接使用我开始使用的 meshgrid 解决方案”,有两个原因:一,如果有简单的解决方法,通常不希望使用像 numpy 这样的非标准库没有非标准库的问题,以及两个,如果您需要处理大型数组,生成大型网格可能会花费时间/内存。
import itertools as it
a = [[1, 8, 9, 10],[2, 15, 3, -1],[3,1,6,11],[13,15,5,-2]]
rowSize = len(a[0])
values = sorted(enumerate(it.chain(*a)), key=lambda x:x[1]) # Pair each value with its 1D index, then sort the list.
minVal = values[0][1]
maxVal = values[-1][1]
maxIndices = map(lambda x:x[0], filter(lambda x:x[1]==maxVal, values)) # Get a list of all the indices that match the maximum value
minIndices = map(lambda x:x[0], filter(lambda x:x[1]==minVal, values)) # Get a list of all the indices that match the minimum value
def getVector(index1, index2, rowSize): # A function that translates a pair of 1D index values to a "quiver vector"
return ((index1 % rowSize) - (index2 % rowSize), (index1 / rowSize) - (index2 / rowSize))
vectors = [getVector(k2, k1, rowSize) for k1, k2 in it.product(maxIndices, minIndices)] # produce a list of the vectors formed by all possible combinations of the 1D indices for maximum and minimum values
U, V = sorted(vectors, key=lambda x:(x[0]*x[0] + x[1]*x[1])**0.5)[0]
print U, ",", V
2 , 0