假设我有一个二维坐标数组,看起来像
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]])
必须有一个更简单的方法来做到这一点?
我有一个带有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) 目前,我的代码大量使用具有多维数据类型的结构化掩码数组,其中包含数十个字段和数千字节的项目大小。看起来这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 …
我一直在阅读掩码数组文档,但我很困惑 - 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) 我理解如何创建一个掩码数组,我想在记录数组中使用掩码,以便我可以使用命名属性访问这些数据.当我从一个蒙版数组创建一个记录数组时,掩码似乎"丢失"了:
>>> 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) 我有一张我发现轮廓的图像,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) 我注意到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) 我正在尝试计算包含 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似乎忽略了这一点。我在想这与将内存存储在数组中的方式有关,就好像我在修改值的副本而不是值本身一样,但是我对此并不足够了解,因此不知道如何解析它。
这是我要做的事情的简化版本:
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
谢谢 !
我正在尝试从 netCDF4 文件中提取数据。这些包含“MaskedArrays”,它们是 Numpy 库的一部分。
我的数据包含:latitude、longitude、day和values(分隔在不同的文件中)。此外,还有一个显示哪些纬度/经度由于各种原因(没有测量或其他原因)无效的掩码。
我的数据看起来像这样(对于屏蔽数据):
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) masked-array ×10
python ×10
numpy ×8
mask ×2
arrays ×1
contour ×1
data-science ×1
matrix ×1
performance ×1
scikit-image ×1