“Numpy”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
(→字符串数组) |
||
第64行: | 第64行: | ||
>>> itemz = array([('Meaning of life DVD', 42, 3.14), ('Butter', 13,2.72)], dtype=t) |
>>> itemz = array([('Meaning of life DVD', 42, 3.14), ('Butter', 13,2.72)], dtype=t) |
||
*参见 [https://blog.csdn.net/Zhili_wang/article/details/81140282] |
*参见 [https://blog.csdn.net/Zhili_wang/article/details/81140282] |
||
====字符串数组==== |
|||
*charar = np.chararray(10, itemsize=10,unicode=True) #字符串长度为10的字符串数组 |
|||
===特殊数值 nan,inf=== |
===特殊数值 nan,inf=== |
2021年10月2日 (六) 09:33的版本
http://bigsec.net/b52/scipydoc/numpy_intro.html
ndarray
- shape() #数组的形状,虽然len()可以运行
- size() #数组的总元素
- a=np.empty_like(b) #初始化一个和b数组一样shape的空数组
- 产生序列数组 a=np.arange(20)
- 合并两个数组 np.append(array1,array2)
- 选择数组在某个范围之内 sel=np.where((wave < 6800) & (wave > 3800))
- 利用内循环赋值
a = [0 for x in range(0, 1000)]
数组元素
- np.take() 提取多个不连续的元素,对于一维数组来说,较为简单,不用指定维度。方法类似提取单个元素,如果a是一个numpy array,a.take(m,1)表示取每一行的第m个值;a.take(m,0)表示取第m行
print(a.take([1,3,4]))
数组运算
- argmin,argmax
- 数组中极值的位置
- clip(a,a_min,a_max)
- array(a).clip(a_min.a_max)
- reduce,reduceat
- reduceat 有点复杂 参见[1]
- unique,sort,sum
- a=np.zeros([3,5])+1
- np.sum(a,1) #只对多维数组的某一个方向上求和
- roll #平移
- array[::-1] 数组倒序
- np.hpstack: stack数组
- np.hsplit: split数组
p = np.array([1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]) q = np.array([2.35, 5.75, 7.75, 3.15]) newa = np.hstack((p, q)) r = np.hsplit(newa,3) # three equally shaped arrays 11 print "Array r:"
- percentile
- wout=np.percentile(flatchain,[16,50,84],0) #flatchain 是二维数组,这是在一个维度上求其分布的范围
- 布尔型数组取否运算 (~)
数据类型
- dtype
- dtype=object 比较好用,这样每个元素可以是另外一个数组,可以不等长。合并的时候可以采用 hstack的命令
a1=np.arange(10) a2=np.arange(20) a=np.array([a1,a2],dtype=object) a3=np.hstack(a)
- dtype=str 字符串 (只能是一位字符)
- dype='S256'
- astype 装换格式(数组的dtype不能直接修改)
>>> b = np.array([1.23,12.201,123.1]) >>> b.dtype dtype('float64') >>> c = b.astype(int)
- 可以自定义
>>> t = dtype([('name', str, 40), ('numitems', numpy.int32), ('price',numpy.float32)]) >>> itemz = array([('Meaning of life DVD', 42, 3.14), ('Butter', 13,2.72)], dtype=t)
- 参见 [2]
特殊数值 nan,inf
- isnan, isinf ,isnull
- nan只能用isnan来判断
a=1/np.arange sel=np.where(np.isinf(a))
- nan_to_num(x)
直接将nan数值替换为0
字符串数组
- dtype='str'
- 同时对每个元素操作见这里 https://docs.scipy.org/doc/numpy/reference/routines.char.html
- 字符串数组里面直接定位一个元素,用index会报错,用find返回的是一个布尔数组
- 解决办法:用tolist()再用index定位
格式输出
x = np.random.random(10) np.set_printoptions(precision=3, suppress=True): print(x) print(np.array_str(x, precision=2)) np.array2string(x, formatter={'float_kind':'{0:.3f}'.format}) print(np.vectorize("%.2f".__mod__)(x))
- 另外一个方法
def ndprint(a, format_string ='{0:.2f}'): print [format_string.format(v,i) for i,v in enumerate(a)]
叠加标准输出:%r 不换行 %n 换行
for n in range(30): sys.stdout.write("\r[{0}{1}]".format('#' * n, ' ' * (30 - n)))
for n in range(30): sys.stdout.write("\n[{0}{1}]".format('#' * n, ' ' * (30 - n)))
简单文件存取
- ndarray.tofile(self, fid, sep=”“, format=”%s”)
数组的简单存取,比较方便可以用于多维数组(二进制格式)
- np.load(fname):
fname:文件,以.npy为扩展名,压缩扩展名为.npz
- np.save(fname,array)
- numpy.fromfile(file, dtype=float, count=-1, sep=)
- np.loadtxt(frame,dtype = np.float,delimiter = None,unpack = False)
- numpy.savetxt(fname, X, fmt=’%.18e’, delimiter=’ ‘, newline=’\n’, header=”, footer=”, comments=’# ‘)
可以把一个数组一次性写入某个文件,但是第一个参数貌似必须是文件名,而且不能续写,写完后文件就被关闭。只能最多是2维数组
多维数组
- 极值
- Ha是是个二维map
Hamax=Ha.max() xmax,ymax=np.unravel_index(np.argmax(Ha, axis=None), Ha.shape) #极值位置
- 降维 Ha.flatten()
- Ha.reshape(-1) # 也可以达到降维的效果
- squeeze 把多维数组里面 为1的压缩,比如(1,2,2)变成(2,2)
- ravel(),把矩阵向量化
行向量,列向量
- 与数组不同的是行矢量是二维,提取某个参数时需要指定元素在两个维度下的位置如 a[0,0]代表两个维度中位置都为0的元素。
a=np.arange(10).reshape(1,-1) print(a[0,-1])
broadcast
- 当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。 广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。 这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
- 所以,一个(4,5)的矩阵可以直接和(5,)的向量相加,这时候,每行都加上这个数
- 一个(4,5)矩阵不能直接和(4,)的向量相加,这时候可以采用None标签来扩维,即扩展为(4,1)矩阵
a=np.arange(20).reshape((4,5)) b=np.ones(5) c=np.ones(4)*2 print(a+b) print(a+c[:,None]) #a+c会出错
vectorize
- 可以将只能对数值计算的函数,变成可以对数组计算,比如积分
import scipy.integrate as integrate vec_expint=np.vectorize(expint) def expint(t1,t2): return integrate.quad(CSFH,t1,t2)[0]