标签: masked-array

如何正确掩盖numpy 2D阵列?

假设我有一个二维坐标数组,看起来像

x = array([[1,2],[2,3],[3,4]])

以前在我的工作到目前为止,我生成了一个面具,最终看起来像

mask = [False,False,True]

当我尝试在2D坐标向量上使用此蒙版时,出现错误

newX = np.ma.compressed(np.ma.masked_array(x,mask))

>>>numpy.ma.core.MaskError: Mask and data not compatible: data size 
   is 6, mask size is 3.`
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的.所以我试着简单地使用以下面具:

mask2 = np.column_stack((mask,mask))
newX = np.ma.compressed(np.ma.masked_array(x,mask2))
Run Code Online (Sandbox Code Playgroud)

我得到的是接近:

>>>array([1,2,2,3])

我期望(和想要):

>>>array([[1,2],[2,3]])

必须有一个更简单的方法来做到这一点?

python numpy mask matrix masked-array

19
推荐指数
3
解决办法
5万
查看次数

如何在多列上屏蔽numpy结构化数组?

我有一个带有dtype的numpy结构化数组,例如:

A = numpy.empty(10, dtype=([('segment', '<i8'), ('material', '<i8'), ('rxN', '<i8')]))
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建一个面具,例如:

A[A['segment'] == 42] = ...
Run Code Online (Sandbox Code Playgroud)

有没有办法在多列上创建掩码?例如(我知道这不起作用,但我希望它能做到):

A[A['segment'] == 42 and A['material'] == 5] = ...
Run Code Online (Sandbox Code Playgroud)

python numpy mask masked-array

11
推荐指数
1
解决办法
1511
查看次数

具有掩码数组的 xarray,同时保留整数数据类型

目前,我的代码大量使用具有多维数据类型的结构化掩码数组,其中包含数十个字段和数千字节的项目大小。看起来这xarray可能是一个很好的选择,但是当我尝试向它传递一个掩码数组时,它会将其数据类型更改为 float:

In [137]: x = arange(30, dtype="i1").reshape(3, 10)

In [138]: xr.Dataset({"count": (["x", "y"], ma.masked_where(x%5>3, x))}, coords={"x": range(3), "y":
     ...: range(10)})
Out[138]:
<xarray.Dataset>
Dimensions:  (x: 3, y: 10)
Coordinates:
  * y        (y) int64 0 1 2 3 4 5 6 7 8 9
  * x        (x) int64 0 1 2
Data variables:
    count    (x, y) float64 0.0 1.0 2.0 3.0 nan 5.0 6.0 7.0 8.0 nan 10.0 ...
Run Code Online (Sandbox Code Playgroud)

这对我来说是不可取的,因为(1)我的数据集的内存消耗将会爆炸(它已经很大),并且(2)我的许多整数数据类型都是位字段,不能表示为浮点数。尽管int32位域可以无损地表示为 a float64,但来回比较丑陋且容易出错。

是否可以xarray.Dataset …

python python-xarray masked-array

8
推荐指数
1
解决办法
2190
查看次数

为什么 Numpy 掩码数组有用?

我一直在阅读掩码数组文档,但我很困惑 - MaskedArray 与仅维护值数组和布尔掩码有什么不同?有人能给我一个例子,其中 MaskedArrays 更方便,或者性能更高吗?

更新 6/5

为了更具体地说明我的问题,这里是一个如何使用 MaskedArray 的经典示例:

>>>data = np.arange(12).reshape(3, 4)
>>>mask = np.array([[0., 0., 1., 0.],
                    [0., 0., 0., 1.],
                    [0., 1., 0., 0.]])

>>>masked = np.ma.array(data, mask=mask)
>>>masked

masked_array(
  data=[[0, 1, --, 3],
        [4, 5, 6, --],
        [8, --, 10, 11]],
  mask=[[False, False,  True, False],
        [False, False, False,  True],
        [False,  True, False, False]],
  fill_value=999999)

>>>masked.sum(axis=0)

masked_array(data=[12, 6, 16, 14], mask=[False, False, False, False], fill_value=999999)
Run Code Online (Sandbox Code Playgroud)

我可以很容易地以这种方式做同样的事情:

>>>data = np.arange(12).reshape(3, 4).astype(float)
>>>mask = np.array([[0., 0., 1., …
Run Code Online (Sandbox Code Playgroud)

python numpy masked-array

8
推荐指数
1
解决办法
3536
查看次数

如何在Numpy中屏蔽记录数组的元素?

我理解如何创建一个掩码数组,我想在记录数组中使用掩码,以便我可以使用命名属性访问这些数据.当我从一个蒙版数组创建一个记录数组时,掩码似乎"丢失"了:

>>> data = np.ma.array(np.ma.zeros(30, dtype=[('date', '|O4'), ('price', '<f8')]),mask=[i<10 for i in range(30)])
>>> data
masked_array(data = [(--, --) (--, --) (--, --) (--, --) (--, --) (--, --) (--, --) (--, --)
(--, --) (--, --) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0)
(0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0)],
         mask = [(True, …
Run Code Online (Sandbox Code Playgroud)

python numpy structured-array masked-array

6
推荐指数
1
解决办法
1815
查看次数

从 skimage 轮廓创建蒙版

我有一张我发现轮廓的图像,skimage.measure.find_contours()但现在我想为完全在最大闭合轮廓之外的像素创建一个蒙版。知道如何做到这一点吗?

修改文档中的示例:

import numpy as np
import matplotlib.pyplot as plt
from skimage import measure

# Construct some test data
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]
r = np.sin(np.exp((np.sin(x)**2 + np.cos(y)**2)))

# Find contours at a constant value of 0.8
contours = measure.find_contours(r, 0.8)

# Select the largest contiguous contour
contour = sorted(contours, key=lambda x: len(x))[-1]

# Display the image and plot the contour
fig, ax = plt.subplots()
ax.imshow(r, interpolation='nearest', cmap=plt.cm.gray)
X, Y = ax.get_xlim(), ax.get_ylim()
ax.step(contour.T[1], contour.T[0], linewidth=2, c='r') …
Run Code Online (Sandbox Code Playgroud)

python contour scikit-image masked-array

6
推荐指数
3
解决办法
7896
查看次数

numpy.ma(蒙面)数组均值方法具有不一致的返回类型

我注意到numpy masked-array mean方法在它可能不应该返回时返回不同的类型:

import numpy as np

A = np.ma.masked_equal([1,1,0], value=0)
B = np.ma.masked_equal([1,1,1], value=0) # no masked values

type(A.mean())
#numpy.float64
type(B.mean())
#numpy.ma.core.MaskedArray
Run Code Online (Sandbox Code Playgroud)

其他numpy.ma.core.MaskedArray方法似乎是一致的

type( A.sum()) == type(B.sum())
# True
type( A.prod()) == type(B.prod())
# True
type( A.std()) == type(B.std())
# True
type( A.mean()) == type(B.mean())
# False
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

更新:正如评论中所指出的那样

C = np.ma.masked_array([1, 1, 1], mask=[False, False, False])
type(C.mean()) == type(A.mean())
# True 
Run Code Online (Sandbox Code Playgroud)

python numpy masked-array

5
推荐指数
1
解决办法
305
查看次数

使用 NaN 计算 numpy 数组中的移动平均值

我正在尝试计算包含 NaN 的大型 numpy 数组中的移动平均值。目前我正在使用:

import numpy as np

def moving_average(a,n=5):
      ret = np.cumsum(a,dtype=float)
      ret[n:] = ret[n:]-ret[:-n]
      return ret[-1:]/n
Run Code Online (Sandbox Code Playgroud)

使用掩码数组进行计算时:

x = np.array([1.,3,np.nan,7,8,1,2,4,np.nan,np.nan,4,4,np.nan,1,3,6,3])
mx = np.ma.masked_array(x,np.isnan(x))
y = moving_average(mx).filled(np.nan)

print y

>>> array([3.8,3.8,3.6,nan,nan,nan,2,2.4,nan,nan,nan,2.8,2.6])
Run Code Online (Sandbox Code Playgroud)

我正在寻找的结果(如下)理想情况下应该只在原始数组 x 有 NaN 的地方有 NaN 并且应该对分组中的非 NaN 元素的数量进行平均(我需要某种方式来改变函数中 n 的大小。)

y = array([4.75,4.75,nan,4.4,3.75,2.33,3.33,4,nan,nan,3,3.5,nan,3.25,4,4.5,3])
Run Code Online (Sandbox Code Playgroud)

我可以遍历整个数组并按索引检查索引,但我使用的数组非常大,这需要很长时间。有没有一种 numpythonic 的方法来做到这一点?

python numpy masked-array

5
推荐指数
1
解决办法
6375
查看次数

如何更改numpy中的掩码数组的值?

在我的代码中,有时我尝试修改掩码数组的值,但是python似乎忽略了这一点。我在想这与将内存存储在数组中的方式有​​关,就好像我在修改值的副本而不是值本身一样,但是我对此并不足够了解,因此不知道如何解析它。

这是我要做的事情的简化版本:

    x = np.zeros((2,5)) # create 2D array of zeroes
    x[0][1:3] = 5       # replace some values along 1st dimension with 5

    mask = (x[0] > 0)   # create a mask to only deal with the non negative values

    x[0][mask][1] = 10  # change one of the values that is non negative 

    print x[0][mask][1] # value isn't changed in the original array
Run Code Online (Sandbox Code Playgroud)

输出是:

    5.0
Run Code Online (Sandbox Code Playgroud)

什么时候应该是10。

任何帮助将不胜感激,理想情况下,这需要可扩展(这意味着我不一定知道x的形状,或者值非负,或者我需要修改哪个)。

我正在Ubuntu 16.04.2上的python 2.7.12上使用numpy 1.11.0

谢谢 !

python arrays numpy masked-array

5
推荐指数
1
解决办法
3808
查看次数

获取 Numpys 掩码数组中的非掩码值

我正在尝试从 netCDF4 文件中提取数据。这些包含“MaskedArrays”,它们是 Numpy 库的一部分。

我的数据包含:latitudelongitudedayvalues(分隔在不同的文件中)。此外,还有一个显示哪些纬度/经度由于各种原因(没有测量或其他原因)无效的掩码。

我的数据看起来像这样(对于屏蔽数据):

masked_array(
    data =
     [[[-- -- -- ..., -- -- --]
        ..., 
       [-- -- -- ..., -- -- --]]],
    mask =
     [[[ True  True  True ...,  True  True  True]
        ...,
       [ True  True  True ...,  True  True  True]]],
    fill_value = 32767)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种 numpy 方法(或类似方法),它只能提取这些未被屏蔽的值。理想情况下,只需从数据集中删除所有无效条目即可。我找到了.compressed,但它返回了一个一维数组。从第三维来看,这是相当大的信息损失,因为我不知道这些值在哪里。

另外我试过了nonzero = the_array['one of the values'][0].nonzero()。这给了我一个带有纬度/经度值的双数组,但之后我仍然必须访问这些 - 这很慢。不幸的是,在知道如何访问所有这些日期后,我需要在 30*6 个文件上执行此操作,每个文件具有 ~1500×700×365 个数据点:D。

all_days = [(x, rhstmax['stuff'][x][24][1288]) for x …
Run Code Online (Sandbox Code Playgroud)

python performance numpy data-science masked-array

4
推荐指数
1
解决办法
6544
查看次数