我正在尝试使用logical_and两个或更多numpy数组.我知道numpy有这个功能logical_and(),但我发现简单的运算符&返回相同的结果并且可能更容易使用.
例如,考虑三个numpy数组a,b和c.是
np.logical_and(a, np.logical_and(b,c))
相当于
a & b & c?
如果它们(或多或少)相同,使用的优点是logical_and()什么?
我有一些pandas数据帧,其中一些分类预测变量(即变量)为0和1,以及一些数字变量.当我适合像以下的stasmodel:
est = sm.OLS(y, X).fit()
Run Code Online (Sandbox Code Playgroud)
它抛出:
Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).
Run Code Online (Sandbox Code Playgroud)
我使用了转换DataFrame的所有dtypes df.convert_objects(convert_numeric=True)
在此之后,所有数据框变量的dtypes都显示为int32或int64.但最后它仍然显示dtype: object,像这样:
4516 int32
4523 int32
4525 int32
4531 int32
4533 int32
4542 int32
4562 int32
sex int64
race int64
dispstd int64
age_days int64
dtype: object
Run Code Online (Sandbox Code Playgroud)
这里4516,4523是变量标签.
任何的想法?我需要在数百个变量上构建一个多元回归模型.为此,我连接了3个pandas DataFrames,以提出用于模型构建的最终DataFrame.
我需要创建一个包含随机布尔值的大型numpy数组,而不需要调用swap.
我的笔记本电脑有8 GB的RAM.创建一个(1200, 2e6)数组需要不到2秒,并使用2.29 GB的RAM:
>>> dd = np.ones((1200, int(2e6)), dtype=bool)
>>> dd.nbytes/1024./1024
2288.818359375
>>> dd.shape
(1200, 2000000)
Run Code Online (Sandbox Code Playgroud)
对于相对较小的(1200, 400e3),np.random.randint仍然相当快,大约需要5秒才能生成458 MB阵列:
db = np.array(np.random.randint(2, size=(int(400e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'
Run Code Online (Sandbox Code Playgroud)
但是如果我将数组的大小增加一倍以(1200, 800e3)达到交换量,那么创建需要大约2.7分钟db;(
cmd = """
import numpy as np
db = np.array(np.random.randint(2, size=(int(800e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'"""
print timeit.Timer(cmd).timeit(1)
Run Code Online (Sandbox Code Playgroud)
使用random.getrandbits时间更长(约8分钟),并且还使用交换:
from random import getrandbits
db = np.array([not getrandbits(1) for x in xrange(int(1200*800e3))], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
使用 np.random.randintfor (1200, …
我正在开发一个包,它需要来自LAPACK Fortran库的dgtsv子例程的 Python绑定.目前,我正在分发Fortran源文件,dgtsv.f以及我的Python代码,并使用numpy.distutils它自动包装并将其编译成_gtsv.so可从Python调用的共享库.
这是我的setup.py文件目前的样子:
from numpy.distutils.core import setup, Extension, build_ext
import os
fortran_sources = ["dgtsv.f"]
gtsv = Extension(
name="pyfnnd._gtsv",
sources=[os.path.join("pyfnnd", "LAPACK", ff) for ff in fortran_sources],
extra_link_args=['-llapack']
)
setup(
name='pyfnnd',
py_modules=['_fnndeconv', 'demo', '_tridiag_solvers'],
cmdclass={'build_ext': build_ext.build_ext},
ext_modules=[gtsv],
)
Run Code Online (Sandbox Code Playgroud)
请注意,为了实际使用_gtsv.so,我仍然需要链接到预先存在的LAPACK共享库(extra_link_args=['-llapack']).由于这个库应该已经包含dgtsv子例程,在我看来,将函数包装在现有的共享库中更简洁,而不必分发实际的Fortran源.
但是,我从未遇到任何使用F2PY来包装作为共享库的一部分的函数而不仅仅是原始Fortran源代码的示例.这可能吗?
我正在尝试编写一些代码来预测在给定的n维数组上执行离散傅立叶变换所需的时间,但我很难理解n维FFT的计算复杂性.
据我了解:
长度的矢量的一维FFT N应该采取k*(N*log(N))其中k是一些定时恒定
对于M*N矩阵,2D FFT应采用:
N*(k*M*log(M)) + M*(k*N*log(N)) = k*M*N*(log(M)+log(N))
因为它需要在每行和每列中采用1D FFT
这如何概括为ND案例?它应该遵循它应该是k*prod(dimensions)*sum(log(dimensions))吗?
我正在研究Python的多处理模块.我有两个案例:
防爆.1
def Foo(nbr_iter):
for step in xrange(int(nbr_iter)) :
print random.uniform(0,1)
...
from multiprocessing import Pool
if __name__ == "__main__":
...
pool = Pool(processes=nmr_parallel_block)
pool.map(Foo, nbr_trial_per_process)
Run Code Online (Sandbox Code Playgroud)
例2.(使用numpy)
def Foo_np(nbr_iter):
np.random.seed()
print np.random.uniform(0,1,nbr_iter)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,随机数生成器都在其分叉进程中播种.
为什么我必须在numpy示例中明确地进行种子设定,而不是在Python示例中?
我需要使用numpy对非常大的基因组数据集进行排序.我有一个26亿浮点数的数组,维度= (868940742, 3)一旦加载并且只是坐在那里,我的机器上占用了大约20GB的内存.我有一台2015年初的13英寸MacBook Pro,配备16GB内存,500GB固态高清和3.1 GHz intel i7处理器.只是加载数组溢出到虚拟内存,但没有到我的机器遭受的程度,或者我必须停止我正在做的其他事情.
我从22个较小的(N, 2)子阵列逐步构建了这个非常大的数组.
函数使用我调用的22个子数组中的每一个FUN_1生成2个新(N, 1)数组sub_arr.
第一个输出FUN_1是通过插入来自sub_arr[:,0]数组的值生成的b = array([X, F(X)]),第二个输出是通过sub_arr[:, 0]使用数组放入二进制数来生成的r = array([X, BIN(X)]).我分别称这些输出b_arr和rate_arr.该函数返回一个3元组的(N, 1)数组:
import numpy as np
def FUN_1(sub_arr):
"""interpolate b values and rates based on position in sub_arr"""
b = np.load(bfile)
r = np.load(rfile)
b_arr = np.interp(sub_arr[:,0], b[:,0], b[:,1])
rate_arr = np.searchsorted(r[:,0], sub_arr[:,0]) # HUGE efficiency gain …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个看起来像这样的numpy数组:
[a b c ]
[ a b c ]
[ a b c ]
[ a b c ]
Run Code Online (Sandbox Code Playgroud)
所以这涉及更新主对角线和它上面的两个对角线.
这样做的有效方法是什么?
目前,我正在使用h5py生成hdf5数据集.我有类似的东西
import h5py
import numpy as np
my_data=np.genfromtxt("/tmp/data.csv",delimiter=",",dtype=None,names=True)
myFile="/tmp/f.hdf"
with h5py.File(myFile,"a") as f:
dset = f.create_dataset('%s/%s'%(vendor,dataSet),data=my_data,compression="gzip",compression_opts=9)
Run Code Online (Sandbox Code Playgroud)
这适用于相对较大的ASCII文件(400MB).我想对更大的数据集(40GB)做同样的事情.使用h5py有更好或更有效的方法吗?我想避免将整个数据集加载到内存中.
有关数据的一些信息:
dtype=None从np.loadtxt()