屏蔽二维数组并根据屏蔽索引对第二个数组进行操作
Masking a 2D array and operating on second array based off masked indices
我有一个读取和输出二维数组的函数。对于输入中等于 0 的每个索引,我希望输出保持不变(在本例中为 pi),否则我会对其执行一些数学运算。例如:
import numpy as np
import numpy.ma as ma
def my_func(x):
mask = ma.where(x==0,x)
# make an array of pi's the same size and shape as the input
y = np.pi * np.ones(x)
# psuedo-code bit I can't figure out
y.not_masked = y**2
return y
my_array = [[0,1,2],[1,0,2],[1,2,0]]
result_array = my_func(my_array)
这应该给我以下内容:
result_array = [[3.14, 1, 4],[1, 3.14, 4], [1, 4, 3.14]]
即它已将 y**2
应用于二维列表中不等于零的每个元素,并将所有零替换为 pi.
我需要这个,因为我的函数将包含除法,而且我事先不知道索引。我正在尝试将教科书中的 matlab 教程转换为 Python,但这个函数让我很困惑!
谢谢
试试这个:
my_array = np.array([[0,1,2],[1,0,2],[1,2,0]]).astype(float)
def my_func(x):
mask = x == 0
x[mask] = np.pi
x[~mask] = x[~mask]**2 # or some other operation on x...
return x
我建议您可以使用布尔数组来实现您想要的,而不是使用掩码。
def my_func(x):
#create a boolean matrix, a, that has True where x==0 and
#False where x!=0
a=x==0
x[a]=np.pi
#Use np.invert to flip where a is True and False so we can
#operate on the non-zero values of the array
x[~a]=x[~a]**2
return x #return the transformed array
my_array = np.array([[0.,1.,2.],[1.,0.,2.],[1.,2.,0.]])
result_array = my_func(my_array)
这给出了输出:
array([[ 3.14159265, 1. , 4. ],
[ 1. , 3.14159265, 4. ],
[ 1. , 4. , 3.14159265]])
请注意,我专门向函数传递了一个 numpy 数组,最初你传递了一个列表,当你尝试进行数学运算时,这会出现问题。另请注意,我用 1. 而不仅仅是 1 定义了数组,以确保它是一个浮点数组而不是整数数组,因为如果它是一个整数数组,当您将值设置为等于 pi 时,它将截断为 3。
也许最好在函数中添加一块来检查输入参数的 dtype 并查看它是否是 numpy 数组而不是列表或其他对象,并确保它包含浮点数,如果没有,您可以相应地进行调整。
编辑:
根据 Scotty1 的建议改为使用 ~a 而不是 invert(a) 。
直接使用np.where()
即可:
y = np.where(x, x**2, np.pi)
示例:
>>> x = np.asarray([[0,1,2],[1,0,2],[1,2,0]])
>>> y = np.where(x, x**2, np.pi)
>>> print(y)
[[ 3.14159265 1. 4. ]
[ 1. 3.14159265 4. ]
[ 1. 4. 3.14159265]]
我有一个读取和输出二维数组的函数。对于输入中等于 0 的每个索引,我希望输出保持不变(在本例中为 pi),否则我会对其执行一些数学运算。例如:
import numpy as np
import numpy.ma as ma
def my_func(x):
mask = ma.where(x==0,x)
# make an array of pi's the same size and shape as the input
y = np.pi * np.ones(x)
# psuedo-code bit I can't figure out
y.not_masked = y**2
return y
my_array = [[0,1,2],[1,0,2],[1,2,0]]
result_array = my_func(my_array)
这应该给我以下内容:
result_array = [[3.14, 1, 4],[1, 3.14, 4], [1, 4, 3.14]]
即它已将 y**2
应用于二维列表中不等于零的每个元素,并将所有零替换为 pi.
我需要这个,因为我的函数将包含除法,而且我事先不知道索引。我正在尝试将教科书中的 matlab 教程转换为 Python,但这个函数让我很困惑!
谢谢
试试这个:
my_array = np.array([[0,1,2],[1,0,2],[1,2,0]]).astype(float)
def my_func(x):
mask = x == 0
x[mask] = np.pi
x[~mask] = x[~mask]**2 # or some other operation on x...
return x
我建议您可以使用布尔数组来实现您想要的,而不是使用掩码。
def my_func(x):
#create a boolean matrix, a, that has True where x==0 and
#False where x!=0
a=x==0
x[a]=np.pi
#Use np.invert to flip where a is True and False so we can
#operate on the non-zero values of the array
x[~a]=x[~a]**2
return x #return the transformed array
my_array = np.array([[0.,1.,2.],[1.,0.,2.],[1.,2.,0.]])
result_array = my_func(my_array)
这给出了输出:
array([[ 3.14159265, 1. , 4. ],
[ 1. , 3.14159265, 4. ],
[ 1. , 4. , 3.14159265]])
请注意,我专门向函数传递了一个 numpy 数组,最初你传递了一个列表,当你尝试进行数学运算时,这会出现问题。另请注意,我用 1. 而不仅仅是 1 定义了数组,以确保它是一个浮点数组而不是整数数组,因为如果它是一个整数数组,当您将值设置为等于 pi 时,它将截断为 3。
也许最好在函数中添加一块来检查输入参数的 dtype 并查看它是否是 numpy 数组而不是列表或其他对象,并确保它包含浮点数,如果没有,您可以相应地进行调整。
编辑: 根据 Scotty1 的建议改为使用 ~a 而不是 invert(a) 。
直接使用np.where()
即可:
y = np.where(x, x**2, np.pi)
示例:
>>> x = np.asarray([[0,1,2],[1,0,2],[1,2,0]])
>>> y = np.where(x, x**2, np.pi)
>>> print(y)
[[ 3.14159265 1. 4. ]
[ 1. 3.14159265 4. ]
[ 1. 4. 3.14159265]]