Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将此函数转换为无for循环的unfunc?_Python_Arrays_Numpy_Plot - Fatal编程技术网

Python 如何将此函数转换为无for循环的unfunc?

Python 如何将此函数转换为无for循环的unfunc?,python,arrays,numpy,plot,Python,Arrays,Numpy,Plot,我试图根据y轴与x轴的值范围绘制我创建的函数 我想计算的运算在矩阵乘法中很常见: r^T * C * r 式中,r^T应为1100形状,r为100,1形状,C为100100形状的矩阵或Ndaray形状100100。使用numpy.dot相乘,输出应为单个值 该函数只有一个输入,可以是一个数据数组 import numpy as np # The user first sets the values used by the function # Not "true code", becaus

我试图根据y轴与x轴的值范围绘制我创建的函数

我想计算的运算在矩阵乘法中很常见:

r^T * C * r 
式中,r^T应为1100形状,r为100,1形状,C为100100形状的矩阵或Ndaray形状100100。使用numpy.dot相乘,输出应为单个值

该函数只有一个输入,可以是一个数据数组

import numpy as np

# The user first sets the values used by the function
# Not "true code", because input() too complex for the question at hand

r = data                        # an numpy ndarray of 100 values, (100,)
original_matrix =  M            # set matrix, such that M.shape = (100, 100)
param = array of data           # EITHER an array of values, shape (50,), 
                                # OR one value, i.e. a 32/64-bit float
                                # e.g. parameters = np.array of 50 values

def function(param):
    # using broadcasting, "np.sum(param * original_matrix for i in r)"
    new_matrix = np.sum(param[:, None, None] * original_matrix, axis=0)
    # now perform r^T * C * r
    return np.dot( r.transpose(), np.dot( new_matrix,  r) )
调用函数

function(param)
def my_func_1(param):
    # using broadcasting, "np.sum(param * original_matrix for i in r)"
    new_matrix = np.sum(param * original_matrix[None,:,:], axis=0)
    # now perform r^T * C * r
    return np.dot( r.transpose(), np.dot( new_matrix,  r) )

my_vec_func_1 = np.vectorize(my_func_1)
结果为一个值,格式为numpy.float64

我想用一系列值来绘制这个函数,也就是说,我需要这个函数来输入一个np.array并输出一个np.cdarray,必须像NumPy中的其他UFUNC一样。该函数将计算数据数组中的每个元素,并将其绘制为函数

比如说,

import pylab

X = np.arange(100)
Y = sin(X)
pylab.plot(X, Y)
输出


假设我的原始函数是数组参数的函数,结果是np.float64格式,我如何将此函数转换为ufunc?我想在y轴上绘制我的函数与x轴上的参数

如果将函数更改为采用单个参数而不是数组,会怎么样

那你就可以这么做了

X = range(50)
Y = [function(x) for x in X]
pylab.plot(X, Y)

我可以提供两种解决方案

您可以使用np.vectorize使几乎任何函数成为ufunc,它处理数字和np.array,如np.sin函数

function(param)
def my_func_1(param):
    # using broadcasting, "np.sum(param * original_matrix for i in r)"
    new_matrix = np.sum(param * original_matrix[None,:,:], axis=0)
    # now perform r^T * C * r
    return np.dot( r.transpose(), np.dot( new_matrix,  r) )

my_vec_func_1 = np.vectorize(my_func_1)
请注意,np.vectorize并没有真正将代码矢量化。。。如果数组作为参数传递,我只会自动生成一个forloop。使用它在运行时没有收益。。。请参见下面的计时

您可以定义一个真正的矢量化函数,该函数只接受以下代码的一维列表或np.Array作为参数:

def my_vec_func_2(param):
    param = np.asarray(param)
    new_matrix = np.sum(param[:,None,None,None] * original_matrix[None,None,:,:],axis=1)
    return np.dot(r, np.dot(new_matrix,r).transpose())
真正矢量化的代码通常比forloop快得多。为什么在这种情况下增益如此之小,我无法解释这种情况

时间安排

我使用以下代码来测试运行时

import numpy as np
from numpy.random import randint

r = randint(10,size=(100))                       # an numpy ndarray of 100 values, (100,)
original_matrix =  randint(30,size=(100,100)) 

timeit my_vec_func_1(np.arange(10000))
1 loops, best of 3: 508 ms per loop

timeit my_vec_func_2(np.arange(10000))
1 loops, best of 3: 488 ms per loop

timeit [my_func_1(x) for x in np.arange(10000)]
1 loops, best of 3: 505 ms per loop

x轴上的参数是什么意思?您是否有要迭代并查找y值的paramater数组列表?希望文章现在更清楚。该函数仅依赖于参数数组param。y轴是该函数functionparam,根据值数组“param”绘制。为了便于讨论,以param=np.arange50For为例,循环往往会减慢Python的速度,从而使大型数据集无法管理,即使使用的是NumPy。