Python 从高值到低值的抖动矢量

Python 从高值到低值的抖动矢量,python,vector,direction,Python,Vector,Direction,我想画的是使向量从高值到低值。 如果代码从以下位置开始: 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): 请注意,您尚未定义当存在两个相等的

我想画的是使向量从高值到低值。 如果代码从以下位置开始:

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):

请注意,您尚未定义当存在两个相等的最大值时所需的行为,如示例中所示。上面的代码使用“第一个”(最左上方)作为真正的最大值,并忽略所有其他值

说明: 我将列表展平(这意味着我会像阅读书本上的单词一样阅读这些值——首先是第一行,然后是第二行,然后是第三行)。每个值都有一个索引,如下所示:

0  1  2  3
4  5  6  7
8  9  10 11
12 13 14 15
U = xMin - xMax
V = yMin - yMax
例如,第二行和第三列中的一个值的索引为6,因为如果你像书一样阅读数组,它是第七个值

最后,当我们找到最大或最小值的索引时,我们需要从1D索引中获得2D坐标。因此,我们可以使用mod运算符(%)来获得x值

例如,
6%4=2
,因此
X=2
(第三列)

为了得到Y值,我们使用整数除法运算符(/)

例如,
6/4=1
,因此
Y=1
(第二行)

U
V
的公式只需取最大值和最小值的X和Y值,然后减去它们即可得到矢量坐标,如下所示:

0  1  2  3
4  5  6  7
8  9  10 11
12 13 14 15
U = xMin - xMax
V = yMin - yMax
如果您想知道,“他为什么不直接使用我开始使用的meshgrid解决方案”,有两个原因:一个是,如果没有非标准库就可以轻松解决问题,那么使用非标准库(如numpy)通常是不可取的;另一个是,如果您需要处理大型阵列,生成大型网格网格可能会耗费大量的时间/内存

选择最短向量的解决方案: 输出
您的意思是要构造从数组中最高值的坐标指向数组中最低值的坐标的向量吗?“从高值到低值的向量”对我来说似乎模棱两可。嗨,布里奥尼斯,你说得对。我想做一个向量,从阵列中具有较高值的坐标指向较低值的坐标,例如风或通量的会聚和发散。谢谢你帮助我澄清我的问题。谢谢Brionius,说实话,我不太了解你的U和V公式中的min和maxIndex,以及你如何用这些索引定义U和V。你能详细解释一下吗。再次感谢你。@Isaac当然可以-我添加了一个解释部分-看看这是否有助于你理解。如果您愿意,我可以向您展示如何使用您的meshgrid思想解决此问题。另一个问题是,如果存在多个更高的值,则向量可能指向更接近的最高值的坐标。感谢您的详细解释。
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