我正在编写一个包含Cython扩展和使用LAPACK
(和BLAS
)的Python模块.我打开使用两种clapack
或lapacke
,或某种f2c
或f2py
解决方案,如果必要的.最重要的是,我能够调用lapack
并blas
从用Cython在紧密循环不Python的调用开销例程.
我在这里找到了一个例子.但是,该示例取决于SAGE.我希望我的模块可以在不安装SAGE的情况下进行安装,因为我的用户不太可能想要或不需要SAGE.我的用户很可能安装了numpy,scipy,pandas和scikit的软件包,所以这些都是合理的依赖.使用的接口的最佳组合是什么,以及最小的setup.py文件看起来可以获取必要的信息(来自numpy,scipy等)以进行编译?
编辑: 这是我最终做的.它适用于我的macbook,但我不知道它是多么便携.当然有更好的方法.
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
from Cython.Build import cythonize
from numpy.distutils.system_info import get_info
# TODO: This cannot be the right way
blas_include = get_info('blas_opt')['extra_compile_args'][1][2:]
includes = [blas_include,numpy.get_include()]
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"],
include_dirs = includes,
libraries=['blas','lapack'])
])
)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为在我的macbook上,clapack.h
头文件与...相同cblas.h
.然后我可以在我的pyx文件中执行此操作:
ctypedef np.int32_t …
Run Code Online (Sandbox Code Playgroud) 有创建用C定制numpy的dtypes例子在这里:
另外,似乎可以在cython中创建自定义ufunc:
似乎也应该可以使用cython创建一个dtype(然后为它创建自定义ufunc).可能吗?如果是这样,你能发一个例子吗?
使用案例:
我想做一些生存分析.基本数据元素是具有相关审查值的生存时间(浮点数)(如果关联时间表示失败时间则为假,如果它代表审查时间则为True(即,在观察期间未发生故障)).
显然,我可以使用两个numpy数组来存储这些值:时间的float数组和censor值的bool数组.但是,我想说明事件发生多次的可能性(这是一个很好的模型,比如心脏病发作 - 你可以拥有多个).在这种情况下,我需要一个对象数组,我称之为MultiEvent
s.每个都MultiEvent
包含一系列浮点数(未经审查的失败时间)和一个观察期(也是一个浮点数).请注意,所有MultiEvent
s 的故障数量并不相同.
我需要能够在一个MultiEvent
s 数组上执行一些操作:
获取每个故障的数量
获得删失时间(即观察时间减去所有失败时间的总和)
根据其他参数数组(例如危险值数组)计算对数似然.例如,单个MultiEvent
M
和持续危险值的对数似然h
可能是这样的:
sum(log(h) + h*t for t in M.times) - h*(M.period - sum(M.times))
M.times
失败时间的列表(数组,等等)在哪里,M.period
是总观察期.我希望适用适当的numpy广播规则,以便我能做到:
log_lik = logp(M_vec,h_vec)
Run Code Online (Sandbox Code Playgroud)
只要尺寸M_vec
和h_vec
兼容性,它就能工作.
我当前的实现使用numpy.vectorize
.这工作得很好1和2,但实在是太慢了3.另请注意,我不能做这个,因为失败的我多数据对象数量不提前知道.
作为单元测试的一部分,我需要测试两个DataFrames是否相等.DataFrame中列的顺序对我来说并不重要.然而,对熊猫来说似乎很重要:
import pandas
df1 = pandas.DataFrame(index = [1,2,3,4])
df2 = pandas.DataFrame(index = [1,2,3,4])
df1['A'] = [1,2,3,4]
df1['B'] = [2,3,4,5]
df2['B'] = [2,3,4,5]
df2['A'] = [1,2,3,4]
df1 == df2
Run Code Online (Sandbox Code Playgroud)
结果是:
Exception: Can only compare identically-labeled DataFrame objects
Run Code Online (Sandbox Code Playgroud)
我相信表达式df1 == df2
应该评估为包含所有True
值的DataFrame .显然,==
在这种情况下,正确的功能应该是有争议的.我的问题是:是否有一个Pandas方法可以满足我的需求?也就是说,有没有办法进行忽略列顺序的相等比较?
我正在努力学习无形(2.0.0).这似乎是一个了不起的工具,我对此感到非常兴奋,但我在前进中遇到了问题.因为还没有太多的文档,我一直在研究示例和源代码.我遇到了困难,因为大多数例子使用多个无形概念,在源代码中,一个无形类型通常会使用其他类型,所以我最终走下了无形的兔子洞,可以这么说.我认为列出无形API的重要特征以及每个API的功能的简单描述会很有帮助.由于我显然没有资格制作这样的清单,我问你,Stack Overflow的人类!
对于每项功能,请尽可能多地包含以下内容:
功能的名称以及如何导入它.
简单描述它的作用.
为什么这个功能很重要/为什么有人会费心去使用它?
一个使用尽可能少的其他无形或高级Scala概念的简单示例.
通过API的一个特征,我指的是一个单独的东西(例如,类型,函数,对象等),或者一组紧密耦合的这样的东西,由无形2.0定义,可以导入和使用一个程序.我不是指一般概念,如高阶多态或类型级递归.请每个答案只包含一个功能.也许如果有足够的答案并且其他人也使用此列表,我们可以使用答案上的投票来排列不同功能的重要性.
注意:我知道此功能列表.我认为它很棒,它对我帮助很大.但是,我正在寻找与API文档更相似的内容,而不是您可以执行的操作列表.我可以理解许多例子,并从中推断出某些特征的目的,但我经常会被某些特定部分绊倒而无法弄清楚它的功能.
我已经看到一个名为"at"的对象(可能是一个函数)散布在整个无形源和使用无形的代码中.特别是,它用于解答另一个问题.这是代码片段:
object iterateOverHList extends Poly1 {
implicit def iterable[T, L[T] <: Iterable[T]] = at[L[T]](_.iterator)
}
Run Code Online (Sandbox Code Playgroud)
我有一些线索,它与〜>类型的apply方法有关."at"具体做什么,它在哪里定义?
我意识到这与通常的SO问题相反,但是即使我认为它不起作用,下面的代码也能正常工作.下面是一个小型Scala程序,它使用while循环的continuation.根据我对连续传递样式的理解,这段代码应该通过在while循环的每次迭代中向堆栈添加一个帧来产生堆栈溢出错误.但是,它工作得很好.
import util.continuations.{shift, reset}
class InfiniteCounter extends Iterator[Int] {
var count = 0
var callback: Unit=>Unit = null
reset {
while (true) {
shift {f: (Unit=>Unit) =>
callback = f
}
count += 1
}
}
def hasNext: Boolean = true
def next(): Int = {
callback()
count
}
}
object Experiment3 {
def main(args: Array[String]) {
val counter = new InfiniteCounter()
println(counter.next())
println("Hello")
println(counter.next())
for (i <- 0 until 100000000) {
counter.next()
}
println(counter.next())
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
1
Hello …
Run Code Online (Sandbox Code Playgroud) 我经常在工作中使用xsd模式文件,我想知道:是否可以为xsd模式语言编写xsd模式文件?这似乎是一种记录模式语言的明显方式,我认为这将是开发人员尝试的第一件事.但是,我一直无法找到具有明显搜索条件的文件.如果不可能,为什么不呢?如果有可能,有没有人做过,有一个地方我可以下载这样的文件?
笔记:
维基百科建议xsd模式语言"不是100%自我描述",因为"内容和属性声明不能依赖于属性或元素上下文".如果是这样,你能提供一个xsd特征的例子,它需要这样的上下文,因此无法表示吗?
这个问题不仅仅是学术性的.我可能需要在不久的将来编写一个处理xsd模式文件的程序,并且从xsd(使用诸如generateDS之类的工具)生成源代码将是一个容易的起点.
我构建了以下内容:
import shapeless._
import poly._
object Main {
def main(args: Array[String]) = {
object iterateOverHList extends (List ~> Iterator) {
def apply[T](it: List[T]) = it.iterator
}
val x = List(1,2,3) :: List("cat","dog") :: HNil
val xIt = x map iterateOverHList
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码很棒,非常棒.但是,我还想要更多.我想,而不是指定我的HList将包含列表,允许任何Iterable.像这样:
import shapeless._
import poly._
object Main {
def main(args: Array[String]) = {
object iterateOverHList extends (Iterable ~> Iterator) {
def apply[T](it: Iterable[T]) = it.iterator
}
val x = List(1,2,3) :: List("cat","dog") :: HNil
val xIt = x …
Run Code Online (Sandbox Code Playgroud) 在 Julia 中,我可以promote
用来使各种类型的对象兼容。例如:
>promote(1, 1.0)
(1.0,1.0)
>typeof(promote(1, 1.0))
(Float64, Float64)
Run Code Online (Sandbox Code Playgroud)
但是,如果我promote
在数组上使用,它不会给我我想要的:
>promote([1], [1.0])
([1],[1.0])
>typeof(promote([1], [1.0]))
(Array{Int64,1},Array{Float64,1})
Run Code Online (Sandbox Code Playgroud)
我想要的是将Int64
数组转换为Float64
数组,所以我得到如下内容:
>promote_array([1], [1.0])
([1.0],[1.0])
>typeof(promote_array([1], [1.0]))
(Array{Float64,1},Array{Float64,1})
Run Code Online (Sandbox Code Playgroud)
这promote_array
是我编造的一个假设函数。我正在寻找一个真正的功能来做同样的事情。Julia 中是否有一个函数可以promote_array
执行上述操作?
我有一个在Linux机器上运行的Python应用程序,该应用程序连接到在虚拟机内部的Windows Server中运行的MS SQL Server数据库。我有我的理由。我的应用程序进行一些大型查询并处理大量数据。它通常可以正常工作,但是每隔很多次程序就会崩溃,并显示以下内容:
python:read.c:207:tds_get_string:断言`dest_size> =(size_t)string_len'失败。
我不确定从哪里开始。没有Python堆栈跟踪。而是,该程序仅打印以上内容并终止。如果这是正常的例外情况,我可以抓住它并加以处理。
我的sqlalchemy连接字符串是:
mssql + pyodbc://用户名:密码@本地主机:1433 /数据库?驱动程序= FreeTDS
如果重要,则tsql -C给出以下输出:
编译时设置(通过“配置”脚本建立)
Run Code Online (Sandbox Code Playgroud)Version: freetds v0.91 freetds.conf directory: /etc/freetds MS db-lib source compatibility: no Sybase binary compatibility: yes Thread safety: yes iconv library: yes TDS version: 4.2 iODBC: no unixodbc: yes SSPI "trusted" logins: no Kerberos: yes
我的猜测是我的问题是freetds中的错误的结果。我在Linux Mint机器上通过apt-get安装了freetds和unixodbc。我通过pip安装了pyodbc,并且正在使用anaconda。我一直在尝试从源代码安装各种不同版本的freetds,unixodbc和pyodbc。到目前为止,我还没有找到一种可行的组合。但是,我真的不知道我在做什么。我正在寻找解释,想法或解决方法。或者,当然是简单而完整的解决方案。