【问题标题】:Is there a way to slice an x,y array diagonally?有没有办法对角切片 x,y 数组?
【发布时间】:2021-06-24 16:44:34
【问题描述】:

我有一个 3D 数组(时间、y 方向、x 方向),我想在空间上拆分它。但是,有没有办法对空间数组进行对角切片,而不是只在 y 和 x 中切片?

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

data = np.random.rand(100,45,60)

data_1 = data[:,0:30,0:30]

X,Y = np.meshgrid(np.arange(0,60,1),np.arange(0,45,1))


plt.contourf(X,Y,data[2])
plt.show()

plt.contourf(data_1[2])
plt.xlim(0,60)
plt.ylim(0,45)
plt.show()

第一个图显示了 data 的等高线图,然后是 data_1,但是有没有办法对角切片?比如红线在哪里。

切片是指仅在 x 和 y 方向选择 3D 数据数组的部分。比如只获取红色箭头下的数据。

【问题讨论】:

  • “切片”是什么意思?你想输出什么?
  • 同意马库斯。另外请注意,如果您有 30x30 矩阵,您可以将对角线下方的数据分类 x+y 30。
  • 哦,是的! @Tristan,我认为这可能正在完成我想要做的事情。我现在将更新问题以说明我对切片的意思
  • 为了做到 x + y >30... 在我的情况下,我会这样做:X + Y > 30... plt.contourf(X,Y, data_1)?
  • 您要对绘图还是数据进行切片?如果绘图,一个部分可能应该设置为 0,或 NaN。如果是数据,您是否要转换数据形状(转换为较小的二维数组或一维数组),或者将一半的值设置为例如0 或 NaN,还是屏蔽它们?

标签: python arrays numpy jupyter slice


【解决方案1】:
import numpy as np
from numpy import ma
import matplotlib.pyplot as plt

data = np.random.rand(5,45,60)
data1 = data[2,0:30,0:30]
x2, y2 = np.meshgrid(np.arange(0, 30, 1), np.arange(0, 30, 1))
data1 = ma.masked_where(x2 + y2 > 30, data1)

plt.contourf(x2, y2, data1)
plt.xlim(0,60)
plt.ylim(0,45)
plt.show()

我在上面使用了掩码数组,但也可以改用np.where并将值设置为np.NaN

data1 = np.where(x2 + y2 > 30, np.NaN, data1)

Matplotlib 也不会绘制 NaN 值。

然而,将值设置为 NaN 会丢失原始值,而掩码只是将它们隐藏(移除掩码将恢复原始值)。 NaN 在比较中也可能很棘手。所以口罩可能会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多