Python和科学计算认证群组  - 讨论区

标题:从数组里面找出符合要求的数

2010年11月25日 星期四 14:26

我想从一个数组里面找出>1并且<6的值,不知道有没有什么函数可以用?谢谢

我暂时是这样做的:

c = np.arange(10)

c[(c > 1) * (c < 6)]

 

 

2010年11月25日 星期四 14:48

数组的话,拆分开了再挨个对比,符合的直接append到新数组吧?

这只是我的浅薄认识。

2010年11月25日 星期四 14:59

我觉得那样稍微有点儿麻烦。。。如果numpy提供了什么函数,能用就用呗,哈哈

2010年11月25日 星期四 15:25

函数的话,还是等群主来了问他吧。

 

2010年11月25日 星期四 15:48

等着

2010年11月25日 星期四 18:36

你的方法很好啊,没有比这个还简洁的办法了。

c[(c > 1) * (c < 6)]

如果用函数的话:

np.compress((c>1)*(c<6), c)

实际上和你的写法是一个效果。

不过如果c是一个递增的数组的话,可以用二分法searchsorted()找到两个值的下标,这样对于大数组计算速度会快很多。

2010年11月25日 星期四 20:31

好的,知道了。天天看一集RY老师土豆上的视频,工作之后就觉得有老师讲课的日子太幸福了

2010年11月25日 星期四 20:34

虽然我还没工作,但是已经没有老师给我讲课了。。。

2010年11月25日 星期四 20:41

但是工作了遇到问题,没人能帮你解决,压力就会有点大啊。。。

2010年11月25日 星期四 20:52

所以趁年轻多学点才是王道啊

 

2010年11月25日 星期四 20:54

是,不过还是想在轻松点儿的环境下学习。。。我理想化了

2010年11月25日 星期四 20:57

轻松点的环境说不定你就不想学了O(∩_∩)O~

2010年11月25日 星期四 21:15

确实难说,哈哈,太不自觉了

2010年11月25日 星期四 21:38

年轻又肯学,将来机会还是很多的。我也有许多东西想学习,可惜现在已经力不从心了。

2010年11月25日 星期四 21:56

张老师太谦虚了,你写书不就是一个漫长的学习过程吗?不知道什么时候能正式出版啊。

刚看完你讲的数组结构那个视频,才知道numpy居然还可以用fortran的方式来存储数据。在学python之前,处理一些数据都用的是fortran,不过也只是初级阶段。就觉得fortran函数太少了,什么都得自己写。

不知道用fortran的数组结构来存储数组有什么好处吗?

2010年11月26日 星期五 17:46

刚刚 像c[(c => 1) * (c < 6)]这样的一句话去统计每个区间上出现值的个数,但最后为什么统计出来的个数比总体的个数还多呢?

我一个一个区间打印出来看到,

[0.95, 0.96) 这个区间是这些值:

[ 0.9511004   0.96        0.96        0.96        0.96        0.96        0.96
  0.96        0.96        0.96        0.96        0.96        0.96        0.96
  0.96        0.9511556   0.9530425   0.95648992  0.96        0.96        0.96
  0.96        0.96        0.96        0.96        0.96        0.96        0.96
  0.96        0.96        0.96      ]

[096, 0.97)是这些值:

[ 0.96602326  0.96580016  0.96318739  0.96        0.96        0.96        0.96
  0.96        0.96        0.96        0.96        0.96        0.96        0.96
  0.96        0.96        0.96        0.96380114  0.96309918  0.96281671
  0.96        0.96        0.96        0.96        0.96        0.96        0.96
  0.96        0.96        0.96        0.96        0.96        0.96      ]

这是什么情况啊?

2010年11月26日 星期五 18:37

把程序贴出来看看吧, [0.95, 0.96) 的区间应该不包括0.96,但是你的结果中包括这些数据。

2010年11月26日 星期五 21:15

xsize = x.size

p = 0
for i in np.arange(0,np.ceil(np.max(x)*100)/100+0.01, 0.01):
    in_this = x[(x >= i) * (x < i + 0.01)]
   
    p += float(in_this.size) / xsize
    print p

 

p 我的原意是累计概率,结果算一算的就大于1了。。。

np.ceil(np.max(x)*100)/100 这句话,就是比如说1.456,我想取1.46,但不知道该怎么实现。。。只能用这种比较笨的方法了。。。

 

麻烦RY老师看看什么问题吧

2010年11月26日 星期五 22:52

把数据也贴出来看看。我用随机数测试了一下你的程序,没有发现问题。

import numpy as np

 

 

x = np.random.rand(10000)

t = np.arange(0,np.ceil(np.max(x)*100)/100.0+0.01, 0.01)

p = 0

l = []

for i in t:

    in_this = x[(x>=i)*(x<i+0.01)]

    p += float(in_this.size)/len(x)

    l.append(p)

print p

 

 

import pylab as pl

pl.plot(l)

pl.show()

 

 

至于ceil那段,其实用np.arange(0, np.max(x)+0.01, 0.01)就可以了。另外你的随机数序列不会有小于0的数吗?

2010年11月26日 星期五 23:02

另外,统计的话为什么不用np.histogram函数呢?histogram得到结果进行累加就可以得到你要的累计分布了。累加可以用下面的语句:

np.add.accumulate([1,2,3])

2010年11月27日 星期六 01:58

果然,谢谢RY老师,用你的方法我的数据算出来就没问题了。

我那一堆数没有小于0的,不知道怎样能上传文件啊?数据有点多,总用有52585个。

我换成随机数运行了一下也不存在什么问题,数据上能有什么问题呢?。。。

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号