【问题标题】:Slicing (x,y) coordinates and data out of multiple arrays从多个数组中切片 (x,y) 坐标和数据
【发布时间】:2017-04-25 22:45:26
【问题描述】:

我已经用谷歌搜索并在这里搜索了我的问题的答案,但没有找到答案。我在 slicing 和使用 np.where 上找到了充足的信息,我正在使用其中的一个,但我在切片一些数组时遇到了问题,它似乎没有按照我的意愿进行。

我需要什么:通过一组垂直的(x, y) 和数据数组获取相同的切片。

我现在有 3 二维数组 (n, m),其中 nm 将根据我正在查看的数据集而变化,但对于同一数据集来说都是相同的。数组是X_newY_newZED_H,即xy坐标和数据ZED_H

X_newY_new 的坐标对于每个 ZED_H 是不同的,但差别不大。想象一下,我的数组是垂直堆叠的,0th 位于底部,Nth 位于顶部。 X_newY_new 是一个不规则网格。一旦它们被切片(隔离),它们就会被插值到 regular 网格中。

我的工作:我在0th 数据中找到最大值,就我而言,最大反射率,这给了我ij我可以从中找到(x, y)。然后我制作任意的xminxmaxyminymax 坐标,这些坐标在最大值周围定义了一个“框”。这一点有效。然后我需要传入每组X_newY_newZED_H,然后从这些数组中切出对应于xminxmaxyminymax 内的数据。这些 max'smin's 都包含在每个 (x, y) 数组中。

本质上是通过垂直堆栈数据取底部数据给出的相同垂直框切片。

代码:

# find the x indices
idx = np.where((X_new >= xmin) & (X_new <= xmax))
# find the y indices
idy = np.where((Y_new >= ymin) & (Y_new <= ymax))

# slice the x and y coordinates out of the whole arrays
x_st_Z = X_new[idx[0][0]:idx[0][-1],idx[1][0]:idx[1][-1]]
y_st_Z = Y_new[idy[0][0]:idy[0][-1],idy[1][0]:idy[1][-1]]
# slice my isolated data out of the whole array
#storm_Z = ZED_H[???] # not sure what to slice with here

我尝试了多种使用np.where 的形式来尝试让它工作,但它没有。所以idxidy 应该返回ij 索引,用于在minmax 值内传入的任何(x, y) 满足条件。然后我使用这些 slice X_newY_new 给出“孤立的”坐标和孤立的数据。我不确定如何正确切片数据。 切片 X_new 和 Y_new 也工作不正确,返回整个 X_newY_new 作为idx 和@987654370 中的条件@ 没有被满足,我不明白为什么。我认为它应该返回 X_new &gt; xminX_new &lt; xmax 等的索引。

我不明白出了什么问题。在我的理解中,我显然遗漏了一些东西和一些逻辑。

非常感谢任何帮助和建议,因为我花了很长时间试图理解这一点,但它只是没有点击。

谢谢 利亚姆

【问题讨论】:

  • x 和 y 坐标是规则网格(相同的行或列)还是不规则的分散布局。我建议添加一组样本数组。任何答案都必须提供这样一个集合来演示动作。你可以让这项任务变得更容易。
  • 输入X_new.shape会得到什么?
  • 感谢您的评论 hpaulj,我已将网格信息添加到问题中。 Ebe Isaac,我得到 (259L, 666L) 所以这个数据集的所有 X_new 和 Y_new 都是相同的形状。谢谢
  • 请发布X_newY_new 的最小示例 - 一个包含足够测试信息的示例。
  • ...如果可能,还包括一个简单的ZED_H

标签: python arrays numpy indexing slice


【解决方案1】:

这是解决您问题的简单方法:

X1 = X_new.ravel()
Y1 = Y_new.ravel()
Z1 = ZED_H.ravel()

idx = np.all([X1 >= xmin, X1 <= xmax],axis=0)
idy = np.all([Y1 >= ymin, Y1 <= ymax],axis=0)

storm_Z = Z1[idx & idy]

storm_Z 是一个一维数组,其中包含 ZED_H 的所有值,其对应的 X_newY_new 在各自的最小-最大边界内。 X1[idx]Y1[idy] 分别给出了 X_newY_new 的切片值。

如果您想保留在哪一行(方位角),风暴值被提取,那么您可以执行以下操作

nRows = X_new.shape[0]

storm_Z = []

for i in range(nRows):
    X1 = X_new[i]
    Y1 = Y_new[i]
    Z1 = ZED_H[i]

    idx = np.all([X1 >= xmin, X1 <= xmax],axis=0)
    idy = np.all([Y1 >= ymin, Y1 <= ymax],axis=0)

    storm_Z.append(Z1[idx & idy])

注意storm_Z 是一个参差不齐的数组,这意味着它可能不是规则的;它是一个列表列表,其中所有行的长度不必相同。因此,如果您真的想要一个矩阵,则必须使用 0None 等其他值填充不存在的单元格。

【讨论】:

  • 感谢您的解决方案 Ebe Isaac。我一直在看它并有一个问题。 storm_Z = Z1[idx1 &amp; idx2] 应该是 storm_Z = Z1[idx &amp; idy]。我返回的形状还有 (18477L,) (39848L,) (3520L,),用于X1[idx]Y1[idy]storm_Z。所以我需要把较短的垫起来,然后我才能重塑它们?。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2019-10-22
  • 1970-01-01
相关资源
最近更新 更多