0

我有一个读取和输出二维数组的函数。对于输入中等于 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,而这个功能让我很困惑!

谢谢

4

3 回答 3

4

直接使用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]]
于 2018-05-25T13:41:06.813 回答
2

尝试这个:

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
于 2018-05-25T13:32:51.447 回答
1

我建议您可以使用布尔数组来实现您想要的,而不是使用掩码。

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) 。

于 2018-05-25T13:36:01.483 回答