numpy的函数用法_numpy函数用法-程序员宅基地

技术标签: numpy  机器学习/大数据  

1.nump的where
第一种用法

np.where(conditions,x,y)
if (condituons成立):
  数组变x
else:
  数组变y

eg:满足结果中key为‘a’的值中字符串含有window的则输出windows,否则输出为Not Windows

operating_system=np.where(cfram['a'].str.contains('Windows'),'Windows','Not Windows')

输出结果为:[‘Windows’ ‘Not Windows’ ‘Windows’ ‘Not Windows’ ‘Windows’]

第二种用法:用if..elif..else处理太丑,用where很简便
eg:

cond2 = np.array([True,False,True,False])
cond1 = np.array([True,True,False,False])
result = []
for i in range(4):
    if (cond1[i] & cond2[i]):   result.append(0);
    elif (cond1[i]):    result.append(1);
    elif (cond2[i]):    result.append(2);
    else :  result.append(3);
print(result)

用where只要一句话

result = np.where(cond1 & cond2,0,np.where(cond1,1,np.where(cond2,2,3)))

输出结果:[0, 1, 2, 3]

2.numpy.loadtext
作用是把文本文件(*.txt)读入并以矩阵或向量的形式输出。它有几个参数:skiprows,delimiter,usecoles和unpack。skiprows作用是跳过头行。在默认情况下是通过空格来分割列的,如果想通过其他来分割列则需要通过delimiter来设置。如果你想跳过几列来读取则需要用usecoles来设置。
正常情况下该返回的是二维矩阵,若设置了unpack=True将返回各列。

 np.loadtxt('loadtxt.txt', skiprows=1,delimiter=',') 

返回结果

array([[ 1.,  2.,  3.,  4.],                                                                               array([[ 4.,  7.,  5.,  9.],                                                                   
       [ 4.,  7.,  5.,  9.],                                                                                              [ 7.,  2.,  2.,  2.]])
       [ 7.,  2.,  2.,  3.]])
from io import StringIO # StringIO behaves like a file object
c=StringIO(u"0 1\n2 3")
print np.loadtxt(c)

结果:

[[ 0.  1.]
 [ 2.  3.]]

3.numpy.reshape

#创建一个数组
a=np.array([1,2,3,4,5,6,7,8])
print a
#输出结果是:[1 2 3 4 5 6 7 8]

使用reshape()方法来更改数组的形状,可以看到看数组d成为了一个二维数组

d=a.reshape((2,4))
print d
#输出结果如下:
[[1 2 3 4]
 [5 6 7 8]]

通过reshape生成的新数组和原始数组公用一个内存,也就是说,假如更改一个数组的元素,另一个数组也将发生改变

a[1]=100
print a
print d
#输出结果如下:
[  1 100   3   4   5   6   7   8]
[[  1 100   3   4]
 [  5   6   7   8]]

同理还可以得到一个三维数组

c=a.reshape((2,2,2))
print c
#输出结果:
[[[  1 100]
  [  3   4]]

 [[  5   6]
  [  7   8]]]

形状变化的原则是数组元素不能发生改变,比如这样写就是错误的,因为数组元素发生了变化

c=a.reshape((2,2,3))
print c
#报错,因为总共8个元素,分成3个2行2列的元素,则要2*2*3=12个元素才可以

reshape((-1,1))相当于一行的数组转置

b=np.arange(0,60,10).reshape((-1,1))
#结果如下:
[[ 0]
 [10]
 [20]
 [30]
 [40]
 [50]]
#故下面是相当于[0,1,2,3,4,5]+上面单列的转置矩阵
a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)
#得到结果如下:
[[ 0  1  2  3  4  5]
 [10 11 12 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32 33 34 35]
 [40 41 42 43 44 45]
 [50 51 52 53 54 55]]

4.数组的元素类型可以通过dtype属性获得

# 通过array函数传递list对象
    L = [1, 2, 3, 4, 5, 6]
    print("L = ", L)
    a = np.array(L)
    print("a = ", a)
输出结果('a = ', array([1, 2, 3, 4, 5, 6]))
print(a.dtype)
输出结果:int64

可以通过dtype参数在创建时指定元素类型

d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.float)     
f = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.complex)  #指定元素类型为复数

5.如果更改元素类型,可以使用astype安全的转换

d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.float)
f = d.astype(np.int)
print(f)
#结果:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
#若用下面的直接转,不会报错,但出现一堆乱七八糟的数字
#但不要强制仅修改元素类型,如下面这句,将会以int来解释单精度float类型
d.dtype = np.int
print(d) 

6.numpy.arange
arange函数类似于python的range函数:指定起始值、终止值和步长来创建数组.和Python的range类似,arange同样不包括终值;但arange可以生成浮点类型,而range只能是整数类型.

 np.set_printoptions(linewidth=100, suppress=True) #输出打印的格式
    a = np.arange(1, 10, 0.5)
    print(a)

7.numpy.linespace
通过指定起始值、终止值和元素个数来创建数组,缺省包括终止值

b = np.linspace(1, 10, 10)
print('b = ', b)
#结果
('b = ', array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.]))
# 可以通过endpoint关键字指定是否包括终值
c = np.linspace(1, 10, 10, endpoint=False)
print('c = ', c)
#结果:
('c = ', array([ 1. ,  1.9,  2.8,  3.7,  4.6,  5.5,  6.4,  7.3,  8.2,  9.1]))

8.numpy.logspace可以创建等比数列

# 下面函数创建起始值为10^1,终止值为10^2,有10个数的等比数列 
d = np.logspace(1, 4, 4, endpoint=True, base=2)
print(d)
# 下面创建起始值为2^0,终止值为2^10(包括),有10个数的等比数列         
f = np.logspace(0, 10, 11, endpoint=True, base=2)     
print(f)                                              

9.使用 frombuffer, fromstring, fromfile等函数可以从字节序列创建数组

s = 'abcdzzzz'
g = np.fromstring(s, dtype=np.int8) #以Ascii码转换
print(g)
#结果:字母对应的Ascii码值
[ 97  98  99 100 122 122 122 122]

10.存取数据
切片存取和python一样

a = np.arange(10)                                                  
print(a)                                                           
# 获取某个元素                                                         
print(a[3])                                                        
# 切片[3,6),左闭右开                                               
print(a[3:6])                                                      
# 省略开始下标,表示从0开始                                                  
print(a[:5])                                                       
# 下标为负表示从后向前数                                                    
print(a[3:])                                                       
# 步长为2                                                             
print(a[1:9:2])                                                    
# 步长为-1,即翻转                                                
print(a[::-1])                                                     
# 切片数据是原数组的一个视图,与原数组共享内容空间,可以直接修改元素值                               
a[1:4] = 10, 20, 30                                              
print(a)                                                         
# 因此,在实践中,切实注意原始数据是否被破坏,如:                                         
b = a[2:5]                                                         
b[0] = 200                                                         
print(a)                                                           

11.整数/布尔数组存取
11.1根据整数数组存取:当使用整数序列对数组元素进行存取时,
将使用整数序列中的每个元素作为下标,整数序列可以是列表(list)或者数组(ndarray)。
使用整数序列作为下标获得的数组不和原始数组共享数据空间。

a = np.logspace(0, 9, 10, base=2)
print(a)
i = np.arange(0, 10, 2)
print(i)
# 利用i取a中的元素
b = a[i]
print(b)
#返回结果
 [   1.    2.    4.    8.   16.   32.   64.  128.  256.  512.]
[0 2 4 6 8]
[   1.    4.   16.   64.  256.]
#b的元素更改,a中元素不受影响
b[2] = 1.6
print(b)
print(a)
#返回结果:
[   1.     4.     1.6   64.   256. ]
[   1.    2.    4.    8.   16.   32.   64.  128.  256.  512.]    

11.2布尔存取
使用布尔数组i作为下标存取数组a中的元素:返回数组a中所有在数组b中对应下标为True的元素。生成10个满足[0,1)中均匀分布的随机数。

a = np.random.rand(10)
print(a)
# 大于0.5的元素索引
print(a > 0.5) #判断a是否>5,若大于5返回True
#返回结果:
[ True False  True  True  True  True  True False False  True]
# 大于0.5的元素
b = a[a > 0.5] #取a[True]的元素,即全是a>0.5的元素
print(b) #b全是取出a数组中>0.5的元素
# 将原数组中大于0.5的元素截取成0.5
a[a > 0.5] = 0.5
print(a)
# b不受影响
print(b)   #b还是前面取出a数组中>0.5的元素

12.二维数组的切片

 # [[ 0  1  2  3  4  5]                                       
 #  [10 11 12 13 14 15]                                       
 #  [20 21 22 23 24 25]                                       
 #  [30 31 32 33 34 35]                                       
 #  [40 41 42 43 44 45]                                       
 #  [50 51 52 53 54 55]]                                      
 a = np.arange(0, 60, 10)    # 行向量                            
 print('a = ', a)                                             
 b = a.reshape((-1, 1))      # 转换成列向量                         
 print(b)                                                     
 c = np.arange(6)                                             
 print(c)                                                     
 # f = b + c   # 行 + 列                                        
 print(f)                                                     
 # # 合并上述代码:                                                  
 a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)     
 print(a)   
# 二维数组的切片
print(a[[0, 1, 2], [2, 3, 4]]) #取第02列,13列,24列数据
#结果
[ 2 13 24]
print(a[4, [2, 3, 4]]) #取第42列,43列,44列数据
#结果
[42 43 44]
print(a[4:, [2, 3, 4]]) #从第4行列始,后面的234列数据。a总共5行,故取42列,43列,44列,52列,53列,54列
#结果
[[42 43 44]
 [52 53 54]] 
i = np.array([True, False, True, False, False, True])
#取True的值,i是行向量,即取第一行,第3行,最后一行
print(a[i])
#结果
 [[ 0  1  2  3  4  5]
 [20 21 22 23 24 25]
 [50 51 52 53 54 55]]
print(a[i, 3])取a[i]行的第4列数,下标是从0开始的
#结果
[ 3 23 53]                                           

13.numpy与Python数学库的时间比较
numpy比python快多了,因为numpy中ndarray是C++写的。

for j in np.logspace(0, 7, 8):               
    x = np.linspace(0, 10, j)                
    start = time.clock()                     
    y = np.sin(x)                            
    t1 = time.clock() - start                

    x = x.tolist()                           
    start = time.clock()                     
    for i, t in enumerate(x):                
        x[i] = math.sin(t)                   
    t2 = time.clock() - start                
    print(j, ": ", t1, t2, t2/t1)            

14.元素去重unique

a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))
print('original array:', a)
# 使用库函数unique
b = np.unique(a)
print(u'去重后:', b)
#结果:
array([1, 2, 3, 4, 5, 7, 8])

二维数组的去重,结果会是预期的么?

c = np.array(((1, 2), (3, 4), (5, 6), (1, 3), (3, 4), (7, 6)))
print('二维数组:\n', c)
print('去重后:', np.unique(c))
#结果
array([[1, 2],
       [3, 4],
       [5, 6],
       [1, 3],
       [3, 4],
       [7, 6]])
#去重后并非我们预期的去掉[3,4]:array([1, 2, 3, 4, 5, 6, 7]) 

解决办法:方案1:转换为虚数

    print len(np.split(c, (1, ), axis=1))  #按1,分割,纵向分割,len查看返回几个值,前面好赋值
    r, i = np.split(c, (1, ), axis=1)
    print r  #1,3,5,1,3,7第一列的纵向量
    print i  #第二列的纵向量
    x = r + i * 1j #第一列+第二列.j 将其转换成复数,但是是纵向量
    print x
    x = c[:, 0] + c[:, 1] * 1j #复数行向量
    print('转换成虚数:', x)
    print('虚数去重后:', np.unique(x))  #复数可用Unique去重
    print(np.unique(x, return_index=True))   #return_index是Ture表示同时返回原始数组中的下标
#Return_inverse: True表示返冋重建原始数组用的下标数组
    idx = np.unique(x, return_index=True)[1]  #【1】是取未重复数组下标
    print idx
    print('二维数组去重:\n', c[idx]) #取c数组中idx下标的元素,即该下标已经计算出去重后的下标
    #结果
    array([[1, 2],
       [1, 3],
       [3, 4],
       [5, 6],
       [7, 6]])

解决办法:方案2:利用set
set是一个无序且不重复的元素集合。集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。可变数组都是不可以做哈希,故要将array/list转成tuple不可变长,再设置成set集合

print('去重方案2:\n', np.array(list(set([tuple(t) for t in c]))))
#结果:
array([[1, 2],
       [1, 3],
       [3, 4],
       [5, 6],
       [7, 6]])

15.stack and axis 堆叠

a = np.arange(1, 7).reshape((2, 3))
    b = np.arange(11, 17).reshape((2, 3))
    c = np.arange(21, 27).reshape((2, 3))
    d = np.arange(31, 37).reshape((2, 3))
    print('a = \n', a)
    print('b = \n', b)
    print('c = \n', c)
    print('d = \n', d)
    s = np.stack((a, b, c, d), axis=0)
    print('axis = 0 ', s.shape, '\n', s)
    s = np.stack((a, b, c, d), axis=1)
    print('axis = 1 ', s.shape, '\n', s)
    s = np.stack((a, b, c, d), axis=2)
    print('axis = 2 ', s.shape, '\n', s)
    #结果:
    解:axis=0,还是原来的矩阵,shape为(4, 2, 3)423列矩阵。axis=1,(2, 4, 3)第0列和第一列换,即243列矩阵。取各种的第一行元素叠加。axis=2,(2, 3, 4)取axis=1时的值再第2列和第3列互换,即234列矩阵。从axis=0中取每个块中的列的第一个数。axis=-1也为(2, 3, 4)和axis=2取的元素一样
    ('axis = 0 ', (4, 2, 3), '\n', array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[11, 12, 13],
        [14, 15, 16]],

       [[21, 22, 23],
        [24, 25, 26]],

       [[31, 32, 33],
        [34, 35, 36]]]))
('axis = 1 ', (2, 4, 3), '\n', array([[[ 1,  2,  3],
        [11, 12, 13],
        [21, 22, 23],
        [31, 32, 33]],

       [[ 4,  5,  6],
        [14, 15, 16],
        [24, 25, 26],
        [34, 35, 36]]]))
('axis = 2 ', (2, 3, 4), '\n', array([[[ 1, 11, 21, 31],
        [ 2, 12, 22, 32],
        [ 3, 13, 23, 33]],

       [[ 4, 14, 24, 34],
        [ 5, 15, 25, 35],
        [ 6, 16, 26, 36]]]))

15.np.dot 点击
np.dot([1,2,3],[4,5,6]) = 1*4 + 2*5 + 3*6 = 32

16.数组拼接
numpy.concatenate((a1,a2,…), axis=0)
注:a.T表示a的转置

>>> a=np.array([1,2,3])
>>> b=np.array([11,22,33])
>>> c=np.array([44,55,66])
>>> np.concatenate((a,b,c),axis=0)  # 默认情况下,axis=0可以不写
array([ 1,  2,  3, 11, 22, 33, 44, 55, 66]) #对于一维数组拼接,axis的值不影响最后的结果

>>> a=np.array([[1,2,3],[4,5,6]])
>>> b=np.array([[11,21,31],[7,8,9]])
>>> np.concatenate((a,b),axis=0)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [11, 21, 31],
       [ 7,  8,  9]])
>>> np.concatenate((a,b),axis=1)  #axis=1表示对应行的数组进行拼接
array([[ 1,  2,  3, 11, 21, 31],
       [ 4,  5,  6,  7,  8,  9]])

15.numpy的基础用法汇总

#coding=utf-8
__author__ = 'mac'

import numpy as np

#python中list中可以有字符,数字等类型。故每次都要判断list的类型,并且转换,所以会慢。而ndarray中只能同一种数据类型
lst=[[1,3,6],[2,4,6]]
print type(lst)
np_lst=np.array(lst)
print (type(np_lst))
np_lst=np.array(lst,dtype=np.float) #dtype可以指定数据类型
print (np_lst.shape) #shape型状,(2,3)23print  (np_lst.ndim)  #ndim维数
print (np_lst.dtype) #dtype数居类型
print (np_lst.itemsize) #itemsize每个元素的大小,float64,那每个元素是8个字节,故为8
print (np_lst.size) #size的大小,该数组中总共有6个数,则size大小为6

#numpy的some Arrays一些数组
print (np.zeros([2,4])) #生成24列的0矩阵
print (np.ones([3,5])) #生成35列的都是1的矩阵
print ('Rand:') #随机数:生成均匀分布的数据
print (np.random.rand(2,4)) #生成24列的随机数,里面的数据都是均匀分布的
print (np.random.rand()) #不加任何参数只打印了一个随机数
print ('RandInt:') #随机整数
print (np.random.randint(1,10,3)) #因为是生成随机整数,故参数不能为空。生成1-10,不包括103个整数
print (np.random.randint(1,10)) #只生成一个随机整数,从1-10,不包括10
print ('Randn:') #随机数:标准正态分布
print (np.random.randn(2,4)) #生成24列的标准正态分布的随机数
print ('Choice:') #生成指定的随机数,值只能从给出的随机数中选择
print (np.random.choice([10,20,30])) #生成的随机数只能是102030中选择
print ('Distribute:') #生成一些数学常用的分布:二项分布等
print (np.random.beta(1,10,100)) #从1-10生成100个beta分布的数据

#3 Array opes 数组的操作
print (np.arange(1,11)) #生成1-10的等差数列
print (np.arange(1,11).reshape(2,5)) #reshape生成25列的1-10的数组
print (np.arange(1,11).reshape(2,-1)) #-1表示的缺省值,结果是和上面一样生成25列的数组
#python中的lst只能追加,不能对里面的元素进行相加等操作,但ndarray是可以对里面的元素进行操作的
print (np.exp(lst)) #exp指数操作,此处np是已经把lst转化为ndarray了,故可以做指数操作
print (np.exp2(lst))
print (np.sqrt(lst))  #开方
print (np.sin(lst))  #sin
print (np.log(lst))  #对数

#axis=0,1,2的解释.axis是和数组的维数有关,最大是到维数-1。
#注:axis越大则深入就越大,axis=0取最外层的数组
#下面是324列的数组
lst=np.array([[[1,2,3,4],
               [4,5,6,7]],
              [[7,8,9,10],
               [10,11,12,13]],
              [[14,15,16,17],
               [18,19,20,21]]
              ])
#axis=0是取最外层的数组:若是求sum就是下面3个数组相加
            # [[1,2,3,4],
            #    [4,5,6,7]]+
            # [[7,8,9,10],
            #    [10,11,12,13]]+
            # [[14,15,16,17],
            #    [18,19,20,21]]
            # sum求和1+7+14=22 2+8+15=25 3+9+16=28....
print (lst.sum(axis=0))
#结果如下:
# [[22 25 28 31]
#  [32 35 38 41]]
#axis=1是取次外层的数组:2维的求和操作
            # [1,2,3,4], +
            #    [4,5,6,7] 求和:1+4 2+53+64+7
            # [7,8,9,10], +
            #    [10,11,12,13]  求和:7+108+119+1210+13
            # [14,15,16,17], +
            #    [18,19,20,21] 求和:14+18 15+19 16+20 17+21
print (lst.sum(axis=1))
#结果如下:
# [[ 5  7  9 11]
#  [17 19 21 23]
#  [32 34 36 38]]
#axis=2时再取第二内层的数组:
               # [1,2,3,4]  求和:1+2+3+4=10
               # [4,5,6,7]  求和:4+5+6+7=22
               # [7,8,9,10] 求和:7+8+9+10= 34
               # [10,11,12,13]  求和:10+11+12+13 =46
               # [14,15,16,17]  求和:14+15+16+17 =62
               # [18,19,20,21]  求和:18+19+20+21 =78
print (lst.sum(axis=2))
#结果如下:
# [[10 22]
#  [34 46]
#  [62 78]]
print ('Max:')
print (lst.max(axis=1))
#结果如下:
# Max:
# [[ 4  5  6  7]
#  [10 11 12 13]
#  [18 19 20 21]]
print ('Min:')
print (lst.min(axis=2))
#结果如下:
# Min:
# [[ 1  4]
#  [ 7 10]
#  [14 18]]
lst1=np.array([10,20,30,40])
lst2=np.array([4,3,2,1])
#对两个数组相加
print ('Add:')  #两个数组里的元素相加
print (lst1+lst2)
print ('Sub:')     #两个数组元素相减
print (lst1-lst2)
print ('Mul:')   #两个数组元素相乘
print (lst1*lst2)
print ('Div:') #两个数组元素相除
print (lst1/lst2)
print ('Square:') #取平方
print (lst1**2)
print ('Dot:') #点乘
print (np.dot(lst1.reshape([2,2]),lst2.reshape([2,2])))
# [10,20]    [4,3]    [4*10+20*2,10*3+20]
# [30,40] *  [2,1]  =  [30*4+2*40,30*3+40]
#点乘结果如下:
# Dot:
# [[ 80  50]
#  [200 130]]
print ('Cancatenate:') #像python中的追加,即合在一个数组中
print (np.concatenate((lst1,lst2),axis=0)) #将lst2追到lst1后面,生成一维的数组
#结果如下:
# Cancatenate:
# [10 20 30 40  4  3  2  1]
print (np.vstack((lst1,lst2))) #vstack一整行数组追加。原来两个一行的现在换成两行
#结果如下:
# [[10 20 30 40]
#  [ 4  3  2  1]]
print (np.hstack((lst1,lst2))) #原来两个一行的现在换成一个数组,和concatenate一样和append的效果一样
#结果如下:
#[10 20 30 40  4  3  2  1]
print (np.split(lst1,2)) #split拆分将lst1分成2个数组
# 结果如下:
# [array([10, 20]), array([30, 40])]
print (np.copy(lst1)) #copy拷贝数组lst1

16.线性代数在numpy中的应用

import numpy as np
from numpy import random
import matplotlib.pyplot as plt
from numpy.linalg import inv,qr

x=np.array([[1.,2.,3.],[4.,5.,6.]])

y=np.array([[6.,23.],[-1,7],[8,9]])
print x,y
print x.dot(y)
print np.dot(x,np.ones(3))

x=random.randn(5,5)
mat=x.T.dot(x)
print inv(mat)
print mat.dot(inv(mat))
q,r=qr(mat)
print r

常用Numpy.linalg函数(线性代数中用到的方法)

diag        以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)
dot         矩阵乘法
trace       计算对角线元素的和
det         计算矩阵行列式
eig         计算方阵的本征值和本征向量
inv         计算方阵的逆
pinv        计算矩阵的Moore-Penrose伪逆
qr          计算QR分解
svd         计算奇异值分解(SVD)
solve       解线性方程组Ax=b,其中A为一个方阵
lstsq       计算Ax=b的最小二乘解

17.numpy中的cumsum函数的用法
cumsum数组内的所有元素累加
cumsum参数有:dtype,axis

a = np.array([[1,2,3], [4,5,6]])
print np.cumsum(a)
#输出的结果:
# array([ 1,  3,  6, 10, 15, 21]) 它是上面的元素累加前一个值的结果
print np.cumsum(a, dtype=float)
#输出的结果:
# [  1.   3.   6.  10.  15.  21.]
print np.cumsum(a,axis=0) #每一列累加前一个值(1+4,2+5,3+6)
#输出结果:
# [[1 2 3]
#  [5 7 9]]
print np.cumsum(a,axis=1) #每一行累加前一个值[1,1+2,1+2+3],[4,4+5,4+5+6]
#输出结果:
# [[ 1  3  6]
#  [ 4  9 15]]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012474716/article/details/78709464

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签