有关类型化内存视图的Cython文档列出了三种分配给类型化内存视图的方法:
np.ndarray和cython.view.array.假设我没有从外部传入我的cython函数的数据,而是想分配内存并将其作为a返回np.ndarray,我选择了哪些选项?还假设该缓冲区的大小不是编译时常量,即我不能在堆栈上分配,但需要malloc选项1.
因此,3个选项可以解释如下:
from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view
np.import_array()
def memview_malloc(int N):
cdef int * m = <int *>malloc(N * sizeof(int))
cdef int[::1] b = <int[:N]>m
free(<void *>m)
def memview_ndarray(int N):
cdef int[::1] b = np.empty(N, dtype=np.int32)
def memview_cyarray(int N):
cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.
一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.
推荐三种方法中的哪一种?或者有更好的选择吗? …
我正在尝试向Python distutils添加安装后任务,如如何使用简单的安装后脚本扩展distutils中所述?.该任务应该在已安装的lib目录中执行Python脚本.此脚本生成安装包所需的其他Python模块.
我的第一次尝试如下:
from distutils.core import setup
from distutils.command.install import install
class post_install(install):
def run(self):
install.run(self)
from subprocess import call
call(['python', 'scriptname.py'],
cwd=self.install_lib + 'packagename')
setup(
...
cmdclass={'install': post_install},
)
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但据我所知,有两个不足之处:
PATH,则安装后脚本将使用不同的解释器执行,这可能会导致问题.distutils.cmd.Command.execute.我怎样才能改进我的解决方案?这样做有推荐的方法/最佳做法吗?如果可能的话,我想避免引入另一个依赖.
这个函数有一个回调,如:function(任何结果的数组){...};
但我不知道结果意味着什么.
例如,chrome.tabs..executeScript(null,{code:"var x = 10"},function(){});
如何将"x"返回给回调?
例如,我可以使用python setup.py build --compiler=msvc或者python setup.py build --compiler=mingw32仅使用python setup.py build,在这种情况下将使用默认编译器(例如bcpp).如何在setup.py中获取编译器名称(例如msvc,mingw32和bcpp,分别)?
UPD.:我不需要默认的编译器,我需要实际使用的那个,这不一定是默认的.到目前为止,我还没有找到比解析更好的方法sys.argv来查看那里是否有--compiler...字符串.
假设我有一个bash数组(例如所有参数的数组),并希望删除与特定模式匹配的所有参数,或者将所有剩余元素复制到新数组.或者,反过来,保持元素匹配模式.
举例说明:
x=(preffoo bar foo prefbaz baz prefbar)
Run Code Online (Sandbox Code Playgroud)
我想删除所有内容pref以便获取
y=(bar foo baz)
Run Code Online (Sandbox Code Playgroud)
(订单不相关)
如果我想要用空格分隔的单词列表,那该怎么办?
x="preffoo bar foo prefbaz baz prefbar"
Run Code Online (Sandbox Code Playgroud)
然后再次删除所有内容pref以便获取
y="bar foo baz"
Run Code Online (Sandbox Code Playgroud) 作为Python新手我最近发现使用Py 2.7我可以做类似的事情:
print '{:20,.2f}'.format(123456789)
Run Code Online (Sandbox Code Playgroud)
这将产生最终的输出:
123,456,789.00
Run Code Online (Sandbox Code Playgroud)
我现在想要为pandas df获得类似的结果,所以我的代码就像:
import pandas as pd
import random
data = [[random.random()*10000 for i in range(1,4)] for j in range (1,8)]
df = pd.DataFrame (data)
print '{:20,.2f}'.format(df)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我有错误:
Unknown format code 'f' for object of type 'str'
Run Code Online (Sandbox Code Playgroud)
有什么建议'{:20,.2f}'.format(df)吗?
现在我的想法是索引数据框(它是一个小的),然后格式化其中的每个浮动,可能分配astype(str),并重建DF ......但看起来很丑陋:-(和我'我甚至不确定它会起作用..
你怎么看 ?我被卡住了...并希望在将这些数据帧转换为reportlabs网格时为我的数据帧提供更好的格式.
我想创建一个if语句来检查对象是否是一个空对象.
通过空对象我的意思是如果我做console.log(对象)它打印出{}.
我该怎么做呢?
在接下来的回答"我可以强迫一个numpy ndarray获取其记忆的所有权吗?" 我尝试PyArray_ENABLEFLAGS通过Cython的NumPy包装器使用Python C API函数,发现它没有暴露.
以下尝试手动公开它(这只是重现故障的最小示例)
from libc.stdlib cimport malloc
import numpy as np
cimport numpy as np
np.import_array()
ctypedef np.int32_t DTYPE_t
cdef extern from "numpy/ndarraytypes.h":
void PyArray_ENABLEFLAGS(np.PyArrayObject *arr, int flags)
def test():
cdef int N = 1000
cdef DTYPE_t *data = <DTYPE_t *>malloc(N * sizeof(DTYPE_t))
cdef np.ndarray[DTYPE_t, ndim=1] arr = np.PyArray_SimpleNewFromData(1, &N, np.NPY_INT32, data)
PyArray_ENABLEFLAGS(arr, np.NPY_ARRAY_OWNDATA)
Run Code Online (Sandbox Code Playgroud)
失败并出现编译错误:
Error compiling Cython file:
------------------------------------------------------------
...
def test():
cdef int N = 1000
cdef DTYPE_t *data = <DTYPE_t *>malloc(N …Run Code Online (Sandbox Code Playgroud) 我想访问一个C函数,它返回一个包含double数组的结构(其中这些数组的长度由结构的其他int成员给出)来自python.声明是
typedef struct {
int dim;
int vertices;
int quadrature_degree;
int polynomial_degree;
int ngi;
int quadrature_familiy;
double *weight; /* 1D: ngi */
double *l; /* 2D: ngi * dim */
double *n; /* 2D: ngi * vertices */
double *dn; /* 3D: ngi * vertices * dim */
} element;
extern void get_element(int dim, int vertices, int quad_degree, int poly_degree, element* e);
Run Code Online (Sandbox Code Playgroud)
重要的是我希望能够以double*正确形状的NumPy数组访问所有成员(即dn应该可以作为3D数组访问).
简单地SWIG包装这给了我很好的结构,但所有double*成员都<Swig Object of type 'double *' at 0x348c8a0>使它们无用.我玩过NumPy SWIG接口文件,但无法使任何类型的图像 …
在我的产品网站上,Firefox有时会"检测不到"我的CSS和Javascript代码中的更改.而是它加载旧版本,所以我似乎需要清除缓存.在这种情况下,我该怎么办?这与最新的Firefox(撰写本文时为16.0.1)有关.
编辑!
我忘了说localhost css文件的错误.我的意思是,这是一个旧的js文件,我更新它,上传它,并在产品服务器上firefox认为它是localhost文件.我包含文件的方式:
<link rel="stylesheet" href="/xyz.css" type="text/css" />
Run Code Online (Sandbox Code Playgroud)