我试图找出在C扩展模块中如何为函数提供一个变量(也许是)相当多的参数.
阅读有关PyArg_ParseTuple的内容,您似乎必须知道要接受多少,一些是必需的,一些是可选的,但都有自己的变量.我希望PyArg_UnpackTuple能够处理这个问题,但是当我尝试以错误的方式使用它时,它似乎只会给我总线错误.
作为一个例子,将以下可能想要的python代码放入扩展模块(在C中).
def hypot(*vals):
if len(vals) !=1 :
return math.sqrt(sum((v ** 2 for v in vals)))
else:
return math.sqrt(sum((v ** 2 for v in vals[0])))
Run Code Online (Sandbox Code Playgroud)
这可以用任何数量的参数调用或遍历,hypot(3,4,5),hypot([3,4,5]),并hypot(*[3,4,5])都给予了同样的答案.
我的C函数的开头看起来像这样
static PyObject *hypot_tb(PyObject *self, PyObject *args) {
// lots of code
// PyArg_ParseTuple or PyArg_UnpackTuple
}
Run Code Online (Sandbox Code Playgroud)
许多人认为是yasar11732.这里的下一个人是一个完全正常工作的扩展模块(_toolboxmodule.c),它只接受任何数字或整数参数,并返回由这些参数组成的列表(名称不好).一个玩具,但说明了需要做什么.
#include <Python.h>
int ParseArguments(long arr[],Py_ssize_t size, PyObject *args) {
/* Get arbitrary number of positive numbers from Py_Tuple */
Py_ssize_t i;
PyObject *temp_p, …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的子类numpy.ndarray问题,感觉像
超类的实例变量的值在子类的实例中持久
但我无法完全理解或使其适用于我的示例.
阅读 稍微更现实的例子 - 添加到现有数组的属性我正试图做到这一点.我想在数组中添加一个attrs属性来保存字典中的单位等信息.
这是我有的:
import numpy
class dmarray(numpy.ndarray):
def __new__(cls, input_array, attrs={}):
obj = numpy.asarray(input_array).view(cls)
obj.attrs = attrs
return obj
def __array_finalize__(self, obj):
# see InfoArray.__array_finalize__ for comments
if obj is None:
return
self.attrs = getattr(obj, 'attrs', {})
Run Code Online (Sandbox Code Playgroud)
那么使用它并演示问题
a = dmarray([1,2,3,4])
b = dmarray([1,2,3,4])
a.attrs['foo'] = 'bar'
print(b.attrs)
#{'foo': 'bar'}
b.attrs is a.attrs
# True # hmm....
Run Code Online (Sandbox Code Playgroud)
所以b正在挑选我不想要它的人.令人讨厌的是,如果你这样做它可以正常工作:
from datamodel import *
a = dmarray([1,2,3,4], attrs={'foo':'bar'})
b = dmarray([1,2,3,4])
b.attrs
# {} …Run Code Online (Sandbox Code Playgroud) 我有一组大型数组(每个大约600万个元素),我想基本上执行np.digitize但是多个轴.我正在寻找有关如何有效地执行此操作以及如何存储结果的一些建议.
我需要数组A的所有索引(或所有值或掩码),其中数组B的值在一个范围内,而数组C的值在另一个范围内,D在另一个范围内.我想要值,索引或掩码,以便我可以做一些关于每个bin中A数组值的尚未确定的统计信息.我还需要每个bin中的元素数量,但len()可以做到这一点.
这是我编写的一个看似合理的例子:
import itertools
import numpy as np
A = np.random.random_sample(1e4)
B = (np.random.random_sample(1e4) + 10)*20
C = (np.random.random_sample(1e4) + 20)*40
D = (np.random.random_sample(1e4) + 80)*80
# make the edges of the bins
Bbins = np.linspace(B.min(), B.max(), 10)
Cbins = np.linspace(C.min(), C.max(), 12) # note different number
Dbins = np.linspace(D.min(), D.max(), 24) # note different number
B_Bidx = np.digitize(B, Bbins)
C_Cidx = np.digitize(C, Cbins)
D_Didx = np.digitize(D, Dbins)
a_bins = []
for bb, cc, dd in itertools.product(np.unique(B_Bidx), …Run Code Online (Sandbox Code Playgroud) numpy数组是否跟踪他们的"查看状态"?
import numpy
a = numpy.arange(100)
b = a[0:10]
b[0] = 100
print a[0]
# 100 comes out as it is a view
b is a[0:10]
# False (hmm how to ask?)
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是numpy.isview()什么.
我希望这能用于代码分析,以确保我正确地做事并在我认为时获得意见.
我试图弄清楚我在这里不明白什么。
我正在关注http://www.scipy.org/Cookbook/FittingData,并尝试拟合正弦波。真正的问题是卫星磁力计数据,该数据在旋转的航天器上产生了很好的正弦波。我创建了一个数据集,然后尝试使其适合以恢复输入。
这是我的代码:
import numpy as np
from scipy import optimize
from scipy.optimize import curve_fit, leastsq
import matplotlib.pyplot as plt
class Parameter:
def __init__(self, value):
self.value = value
def set(self, value):
self.value = value
def __call__(self):
return self.value
def fit(function, parameters, y, x = None):
def f(params):
i = 0
for p in parameters:
p.set(params[i])
i += 1
return y - function(x)
if x is None: x = np.arange(y.shape[0])
p = [param() for param in parameters]
return optimize.leastsq(f, …Run Code Online (Sandbox Code Playgroud)