我有一个数字数组,我想创建另一个数组,表示第一个数组中每个项目的排名.我正在使用Python和NumPy.
例如:
array = [4,2,7,1]
ranks = [2,1,3,0]
Run Code Online (Sandbox Code Playgroud)
这是我提出的最佳方法:
array = numpy.array([4,2,7,1])
temp = array.argsort()
ranks = numpy.arange(len(array))[temp.argsort()]
Run Code Online (Sandbox Code Playgroud)
有没有更好/更快的方法避免两次排序数组?
在Ubuntu 12.04上从源代码构建Python 3.2.3时,zlib模块不可用.
我从python.org下载了官方的源代码发行版,并尝试使用以下命令构建和安装它.
tar xfa Python3.2.3.tar.bz2
cd Python-3.2.3
./configure --prefix=/opt/python3.2
make
sudo make install
Run Code Online (Sandbox Code Playgroud)
make命令输出包括以下内容.
Python build finished, but the necessary bits to build these modules were not found:
_curses _curses_panel _dbm
_gdbm _sqlite3 _ssl
_tkinter bz2 readline
zlib
Run Code Online (Sandbox Code Playgroud)
运行make install并启动解释器后,zlib无法导入模块.
我确认该zlib1g-dev软件包已安装在我的系统上.
我也发现了类似的问题,建议--with-zlib在./configure命令中添加标志.但是,这会返回一个错误,它是一个无法识别的选项,并且没有任何效果.
我正在使用针对英特尔数学核心库构建的NumPy.我使用virtualenv,通常使用pip来安装包.
但是,为了让NumPy找到MKL库,必须在编译之前在NumPy源目录中创建一个site.cfg文件,然后手动构建和安装.我可以编写整个过程的脚本,但我希望有一个更简单的解决方案.
我有一个标准的site.cfg文件,可以在版本控制下用于此目的.是否有任何pip命令行选项会告诉它在构建包之前将特定文件复制到源目录?
或者,是否可以设置任何环境变量而不是在site.cfg文件中提供库路径?这是我使用的site.cfg文件.它几乎逐字逐句地从英特尔网站上获取.
[mkl]
library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64
include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include
mkl_libs = mkl_rt
lapack_libs =
Run Code Online (Sandbox Code Playgroud)
作为参考,我正在运行Ubuntu,Python 2.7和NumPy 1.6.
我是一个相对经验丰富的Python程序员,但是在很长一段时间内没有编写任何C语言并试图理解Cython.我正在尝试编写一个Cython函数,它将在NumPy重组的列上运行.
我到目前为止的代码如下.
recarray_func.pyx:
import numpy as np
cimport numpy as np
cdef packed struct rec_cell0:
np.float32_t f0
np.int64_t i0, i1, i2
def sum(np.ndarray[rec_cell0, ndim=1] recarray):
cdef Py_ssize_t i
cdef rec_cell0 *cell
cdef np.float32_t running_sum = 0
for i in range(recarray.shape[0]):
cell = &recarray[i]
running_sum += cell.f0
return running_sum
Run Code Online (Sandbox Code Playgroud)
在翻译提示:
array = np.recarray((100, ), names=['f0', 'i0', 'i1', 'i2'],
formats=['f4', 'i8', 'i8', 'i8'])
recarray_func.sum(array)
Run Code Online (Sandbox Code Playgroud)
这简单地总结f0了重新排列的列.它编译并运行没有问题.
我的问题是,我如何修改它以便它可以在任何列上运行?在上面的示例中,sum的列是硬编码的,并通过点表示法访问.是否可以更改函数,以便将作为参数的列传入?