我下载了用于Python 2.7的Microsoft Visual C++编译器,并安装它,完整路径vcvarsall.bat
是:
C:\Users\UserName\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat
Run Code Online (Sandbox Code Playgroud)
但是以下代码无法返回它的路径:
from distutils import msvc9compiler
msvc9compiler.find_vcvarsall(9.0)
Run Code Online (Sandbox Code Playgroud)
安装程序不会将安装信息写入注册表,并且从源代码中看find_vcvarsall()
,它似乎无法vcvarsall.bat
从VS90COMNTOOLS
设置中找到该文件,因为它要求包含的文件夹的名称vcvarsall.bat
为VC
:
productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")
Run Code Online (Sandbox Code Playgroud)
如何在不修改注册表或文件夹名称的情况下使用编译器?
的__dict__
一种类型是一个dictproxy
被只读对象.我想知道它的目的是什么.它仅适用于"不允许修改内置类型"吗?我发现了一种可以绕过它的方法.我知道修改内置类型并不是一个好主意.但我试图cdef class
在飞行中修改Cython.
我想知道是否有任何危险的修改__dict__
的cdef class
这种方式?
这是代码:
import gc
gc.get_referents(float.__dict__)[0]["square"] = lambda self: self*self
(3.14).square()
Run Code Online (Sandbox Code Playgroud) 我想分别沿轴0和轴1重复数组的元素M和N次:
import numpy as np
a = np.arange(12).reshape(3, 4)
b = a.repeat(2, 0).repeat(2, 1)
print(b)
[[ 0 0 1 1 2 2 3 3]
[ 0 0 1 1 2 2 3 3]
[ 4 4 5 5 6 6 7 7]
[ 4 4 5 5 6 6 7 7]
[ 8 8 9 9 10 10 11 11]
[ 8 8 9 9 10 10 11 11]]
Run Code Online (Sandbox Code Playgroud)
这有效,但我想知道是否有更好的方法而无需创建临时数组.
我很好奇如何list
实现类型的对象.是吗
O(1)
,但访问项目是O(n)
.O(log(n))
项目访问权限的树结构.O(1)
项目访问权限的哈希表.我很好奇,因为列表可以有键值对,使它们看起来像哈希表,但元素是有序的,看起来像一个向量.
编辑:因为length(list(runif(1e4)))
是1,所以当将元素追加到列表时,它看起来像每次复制整个列表,这使得它非常慢:
但访问速度比矢量慢得多:
z1 <- runif(1e4)
system.time({
for(i in 1:10000) z1[[1 + i]] <- 1
})
Run Code Online (Sandbox Code Playgroud)
输出:
user system elapsed
0.060 0.000 0.062
Run Code Online (Sandbox Code Playgroud)
但:
z1 <- list(runif(1e4))
system.time({
for(i in 1:10000) z1[[1 + i]] <- 1
})
Run Code Online (Sandbox Code Playgroud)
输出:
user system elapsed
1.31 0.00 1.31
Run Code Online (Sandbox Code Playgroud)
初始化包含10000个元素的列表:
z1 <- as.list(runif(1e4))
system.time({
for(i in 1:10000) z1[[1 + i]] <- 1
})
Run Code Online (Sandbox Code Playgroud)
输出:
user system elapsed …
Run Code Online (Sandbox Code Playgroud) 据我所知,list
Python中的类型是一个动态指针数组,当项目被附加到它时会增加它的容量.NumPy中的数组使用连续的内存区域来保存数组的所有数据.
是否有任何类型可以动态增加其作为列表的容量,并将值存储为NumPy数组?类似于C#中的List.如果类型具有与NumPy数组相同的接口,那就太棒了.
我可以创建一个包含NumPy数组的类,并在它完整时调整此数组的大小,例如:
class DynamicArray(object):
def __init__(self):
self._data = np.zeros(100)
self._size = 0
def get_data(self):
return self._data[:self._size]
def append(self, value):
if len(self._data) == self._size:
self._data = np.resize(self._data, int(len(self._data)*1.25))
self._data[self._size] = value
self._size += 1
Run Code Online (Sandbox Code Playgroud)
但DynamicArray不能用作NumPy数组,我认为在np.resize()之前get_data()返回的所有视图都将保留旧数组.
编辑:数组模块中的数组类型是动态数组.以下程序测试列表和数组的增加因子:
from array import array
import time
import numpy as np
import pylab as pl
def test_time(func):
arrs = [func() for i in xrange(2000)]
t = []
for i in xrange(2000):
start = time.clock()
for a in arrs:
a.append(i)
t.append(time.clock()-start)
return np.array(t)
t_list …
Run Code Online (Sandbox Code Playgroud) 我正在绘制一些具有多个不连续性的函数.每个函数都以列表形式给出.我想只在函数连续的地方连接点.
以下是情节正在进行的简化示例.
x=linspace(0,1,100)
y=zeros(100)
y[x<0.5] = x[x<0.5]
y[x>=0.5] = 1 + x[x>=0.5]
plot(x, y, '-o')
Run Code Online (Sandbox Code Playgroud)
在x = 0.5处存在不连续性,但是无论如何,绘图都将所有点与线连接起来.
我的功能当然不同.它们通常在不同的地方有几个不连续点.不连续性的标准很简单.比方说,如果函数跳跃超过0.5,我认为它在那一点是不连续的.
是否有一个选项可以告诉它放下功能不连续的点之间的连接线?我记得能够用gnuplot轻松做到这一点.
从包中导入子模块时,包文件夹中的__init__.py文件将首先执行exec,如何禁用它.有时我只需要一个包中的一个函数,导入整个包有点重.
例如,pandas.util.clipboard
模块不依赖于pandas中的任何其他功能.
from pandas.util.clipboard import clipboard_get
将导入该函数,还导入所有pandas常用模块.是否有一些方法只导入剪贴板模块,因为它是我自己的应用程序文件夹中的模块.
例如,这是一个或表达式:
c = f1 == 0 or f1 - f0 > th
Run Code Online (Sandbox Code Playgroud)
这是编译的C代码:
__pyx_t_24 = (__pyx_v_f1 == 0);
if (!__pyx_t_24) {
} else {
__pyx_t_23 = __pyx_t_24;
goto __pyx_L5_bool_binop_done;
}
__pyx_t_24 = ((__pyx_v_f1 - __pyx_v_f0) > __pyx_v_th);
__pyx_t_23 = __pyx_t_24;
__pyx_L5_bool_binop_done:;
__pyx_v_c = __pyx_t_23;
Run Code Online (Sandbox Code Playgroud)
为什么不输出这个?
__pyx_v_c = (__pyx_v_f1 == 0) || ((__pyx_v_f1 - __pyx_v_f0) > __pyx_v_th)
Run Code Online (Sandbox Code Playgroud)
是goto版本比||
?
例如,这是一个使用指针返回值的简单 c 函数:
void add(double x, double y, double *r)
{
*r = x + y;
}
Run Code Online (Sandbox Code Playgroud)
我想为add()
两个数组中的每个元素调用函数,并通过 numba @jit 函数收集结果。
先编译c代码:
!gcc -c -fpic func.c
!gcc -shared -o func.so func.o
Run Code Online (Sandbox Code Playgroud)
并通过 ctypes 加载它:
lib = ctypes.cdll.LoadLibrary("./func.so")
add = lib.add
add.argtypes = ctypes.c_double, ctypes.c_double, ctypes.c_void_p
add.restype = None
Run Code Online (Sandbox Code Playgroud)
然后是 numba 函数:
from numba import jit, float64
@jit(float64(float64[:], float64[:]))
def f(x, y):
z = np.zeros_like(x)
for i in range(x.shape[0]):
add(x[i], y[i], &z[i]) # here I want to pass the …
Run Code Online (Sandbox Code Playgroud) 以下是将所有时间都移动到月末的代码:
import numpy as np
import pandas as pd
times = np.array([
'2013-07-22T02:10:32.000000000+0900',
'2013-07-22T01:11:13.000000000+0900',
'2013-07-21T23:23:32.000000000+0900',
'2013-07-21T05:59:21.000000000+0900',
'2013-07-21T05:57:30.000000000+0900',
'2013-07-21T05:44:27.000000000+0900',
'2013-07-20T10:45:17.000000000+0900',
'2013-07-20T10:36:53.000000000+0900',
'2013-07-20T09:57:46.000000000+0900',
'2013-07-20T09:57:06.000000000+0900',
'2013-07-20T09:30:57.000000000+0900',
'2013-07-20T08:20:27.000000000+0900',], dtype='datetime64[ns]')
dti = pd.DatetimeIndex(times)
dti.shift(1, "M").values
Run Code Online (Sandbox Code Playgroud)
结果是:
array(['2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900',
'2013-07-31T09:00:00.000000000+0900'], dtype='datetime64[ns]')
Run Code Online (Sandbox Code Playgroud)
但是如何将所有时间一直移动到小时,一天或一周结束?