有没有比 pandas, numpy 轻量的二维数组模块

2020-09-28 16:13:15 +08:00
 imn1
常用二维数组,有时按行读,有时按列读
类似 pandas.DataFrame.loc/iloc/at

单元不多,几十到几百,计算也不多,有时只是读取 /更改而已
如果用内置列表,切换行列方式读取,往往要 zip 一遍,或者另外保存一份旋转(行列交换)的数组
pandas/numpy 感觉太重,没有什么计算的话,不想转到他们的格式,然后又转出来,直接用 dataframe 传参也是太重

想找个轻量一点的模块记录二维数组,方便自由按行或按列读取
namedtuple 格式本来也不错,问题它是 tuple,改变一个单元的值就要一次转换,也不适用 sort

没有的话,打算自己写个类算了
2319 次点击
所在节点    Python
17 条回复
TimePPT
2020-09-28 17:40:04 +08:00
如果考量计算效率的话,numpy 在 python 里是王者了
wuwukai007
2020-09-28 18:54:02 +08:00
是要打包吗,考虑大小
imn1
2020-09-28 19:11:16 +08:00
@wuwukai007 #2
首先,暂不考虑不打包
其次,如果计算部分不多的,这个模块也不会太巨型吧?
shm7
2020-09-28 19:17:53 +08:00
@TimePPT 可能 lz 没法理解 numpy 为什么高效的原因。
wuwukai007
2020-09-28 19:20:30 +08:00
不打包就装一个吗,难道公司内网没有 pip 源不好装?
imn1
2020-09-28 19:54:20 +08:00
@wuwukai007 #4
那我没理解对你说的话
我以为你说项目最后要打包给别人用

@shm7
@TimePPT
Numpy 我知道,常用来计算证券,和商业数据分析
只是有些场合,计算很少的,提取数据的情况多
举个例子
有个二维数组,要提取某一列 1/3/5/7 的数据,如果 pandas/numpy 很简单;如果只是 list,要么写个表达式,要么 zip 一次,取出这列再提取
这个二维数组到其他地方提取方式可能不同,所以要原样传递
这些场合后续计算很少,部分只是提取完就 print 了,没有计算,所以不想每个 py 都 import 一把牛刀,或者把 dataframe 作为参数传递,希望中间过程轻量一点,只是处理杀鸡这点小事而已

这只是个例子,还有很多类似场景
我问问有没有我不知道的模块可以做这事,没有的话,我自己弄个类,搞几个闭包写成方法,就不用各个场景都多写一两句 zip/for 这样的重复劳动了
shm7
2020-09-28 19:59:30 +08:00
@imn1 我还是用的太少了,只有 3 年,不太明白 numpy 被称为重的地方在哪。也不理解 2 维数组取 1357 有啥麻烦。
iConnect
2020-09-28 20:09:34 +08:00
少了 numpy,py 也到不了今天的地位。不要嫌弃 numpy,这是顶梁柱
imn1
2020-09-28 20:40:30 +08:00
@shm7 #7
不难,也不麻烦,能写
例如
a=pandas.DataFrame([[1,1],[1,3],[1,5],[1,7],[1,9]])
a.iloc[[1,3],1]=[2,4]

pandas 这句赋值盲写就行,二维 list 就要稍微转一下脑子
我只是希望无脑套用 [1,3],1,懒得想表达式怎么写,如果场景多就每个表达式都要多想一点点,写成闭包以后就可以盲写了

@iConnect #8
不嫌弃,离开 numpy 我恐怕生计都成问题
只是有些场合,象上面这句 a.iloc,可能整个 py 数百行,只有这两行用到 pandas,为了这个赋值不值得,我宁愿多写一两行省下这个 import 的时间和内存
还是那句,如果有轻便的我试试,没有我就另想办法
TimePPT
2020-09-28 21:21:07 +08:00
@imn1 了解你的出发点了,确实如果仅仅是有限操作的话用 numpy 有点儿大炮轰蚊子了。
minami
2020-09-28 21:32:38 +08:00
搜了一下,这个仓库可能满足你的需求,纯 python 实现的 ndarray:wadetb/tinynumpy
crclz
2020-09-28 21:43:30 +08:00
洁癖
Huelse
2020-09-28 23:28:22 +08:00
或者自己用 C 写然后打包成动态库,完全自定义,当然要小心内存问题
neoblackcap
2020-09-28 23:42:58 +08:00
numpy 在实际会用到 blas 的相关实现。很多时候哪怕你认为是读取的操作,实际上可能是当矩阵变换的操作。会有对应的加速的。一般人写不出那样高效的代码。如果你觉得效率没啥所谓,其实自己用 C 写一个也可以。关键还是看你实际的需求
krixaar
2020-09-29 08:40:08 +08:00
@imn1 #6 > 有个二维数组,要提取某一列 1/3/5/7 的数据
换个思路,“有张数据库表,要提取某一字段 1/3/5/7 行的数据”

> 不想每个 py 都 import 一把牛刀,或者把 dataframe 作为参数传递,希望中间过程轻量一点
参数只传一个表名够轻量吗

> 想找个轻量一点的模块
标准库 import sqlite3,都不用安装了🤣

Let's CRUD🤣
imn1
2020-09-29 14:41:13 +08:00
@krixaar #15
内存表?
打开新思路,谢谢
IgniteWhite
2020-09-29 18:29:01 +08:00
pandas 基于 numpy

numpy 的 array 都是数字,而且在内存里连续占用。这两点要比 python 自己的 list 轻量多了。你试试看 size,比一比就知道了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711304

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX