GVKun编程网logo

如何将一个 uint32 Numpy 数组转换为 4 个 uint8 Numpy 数组来处理字节序(怎么把numpy数组里的数都改成int型)

1

最近很多小伙伴都在问如何将一个uint32Numpy数组转换为4个uint8Numpy数组来处理字节序和怎么把numpy数组里的数都改成int型这两个问题,那么本篇文章就来给大家详细解答一下,同时本文

最近很多小伙伴都在问如何将一个 uint32 Numpy 数组转换为 4 个 uint8 Numpy 数组来处理字节序怎么把numpy数组里的数都改成int型这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。、numpy 的 astype 是如何把 np.uint8 是如何转成 np.float32、Numpy:防止 Float16 数组转换为 Float32、Objective-C 中 Socket 常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte [])等相关知识,下面开始了哦!

本文目录一览:

如何将一个 uint32 Numpy 数组转换为 4 个 uint8 Numpy 数组来处理字节序(怎么把numpy数组里的数都改成int型)

如何将一个 uint32 Numpy 数组转换为 4 个 uint8 Numpy 数组来处理字节序(怎么把numpy数组里的数都改成int型)

如何解决如何将一个 uint32 Numpy 数组转换为 4 个 uint8 Numpy 数组来处理字节序

对于上下文,我正在编写一个写出图像的 Python 程序。但是这些图像有点特殊,因为它们被用作中间数据容器,这些容器被其他用 C 编写的程序进一步消化并使用 libgd 库。我对 C 一无所知。

我的确切问题是我有一个 dtype=''uint32'' 的 Numpy 数组。我想解码这个数组得到4个dtype=''uint8''数组,然后用它们写出一个图像。这可以通过 numpy.view:

完成
  1. img_decoded = img_coded[:,:,np.newaxis].view(''uint8'')

现在,img_decoded 的形状为 (dimY,dimX,4)我的疑问是我应该让什么第三维索引对应什么渠道。我正在与之交互的 C 程序期望最重要的字节写入 Alpha 通道,然后是红色,然后是绿色,最后是蓝色。我怎样才能确保此信件得到满足?我知道这与字节序有关,但这个概念对我来说仍然很模糊。


与所有这些相关,我一直在玩这个以试图深入了解这些概念,但这样的命令让我大吃一惊:

  1. In []: np.array([256 * 4 + 1],dtype=''uint16'').view(dtype=''uint8'')
  2. Out[]: array([1,4],dtype=uint8)

这告诉我最高位的顺序是什么?为什么输出是 [1,4] 而不是相反?这与字节序有什么关系?

解决方法

与我交互的 C 程序期望将最重要的字节写入 Alpha 通道,然后是红色,然后是绿色,最后是蓝色。我如何确保此对应关系得到满足?

这高度依赖于像素编码方法目标平台

关于编码,例如一些库使用 BGRA 格式,而一些库使用 RGBA 格式。许多支持多种格式,但需要一次选择一种。

在传统/主流平台上,uint32 类型由 4 x 8 位组成,并存储在 4 个连续的 8 位字节的内存中。 8 个最高有效位可以存储在与平台有关的最低内存地址或最高内存地址的字节中。这确实是所谓的字节序。某些平台可能具有奇怪的字节序(如中间字节序)或可以支持多个字节序,导致某些情况下运行时定义的字节序(例如,AFAIK、ARM 和 POWER 支持尽管“默认”字节序现在应该是小字节序)。字节序问题仅发生在具有多个字节大小的本机类型(或低级联合)上。

您可以使用您提供的示例代码在运行时检查字节序(尽管使用 uint32 类型的变量更安全)。关于结果(即 [1,4][4,1]),您可以猜测字节序。根据字节顺序,您可以使用 if-else 语句对像素进行编码、解码甚至直接计算(您可以将其放入通用编码/解码函数中)。

另一种解决方案是根本不使用视图,而是使用可移植的按位运算(独立于目标平台的字节序)。

这是一个例子:

  1. alpha = img_coded >> 24
  2. red = (img_coded >> 16) & 0xFF
  3. green = (img_coded >> 8) & 0xFF
  4. blue = img_coded & 0xFF

这告诉我最高位的顺序是什么?为什么输出是 [1,4] 而不是相反?这与字节序有什么关系?

这意味着您的平台使用小端格式。这是主流 x86-64 平台使用的。 little-endian 格式首先存储不太重要的字节(此处为 1)。大端平台上的相同代码应该导致 [4,1]

2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。

2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。

2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。

package main

import "fmt"

func main() {
    x := []byte{}
    fmt.Printf("%#v %T\n", x, x)
}

答案2022-07-30:

答案选 B。这是一个 bug,说正确答案应该是 []uint8{} []uint8 才对,因为 byte 是 uint8 的别名,但现在即使是 x := []uint8{},结果也还是 B。不过为了兼容性,该 bug 目前不会修复,影响不大,详见:https://github.com/golang/go/issues/44391。

在这里插入图片描述

另一道有争议的题,arp和rarp属于数据链路层还是网络层?有人说是网络层,也有人说是数据链路层。我个人倾向于数据链路层。

numpy 的 astype 是如何把 np.uint8 是如何转成 np.float32

numpy 的 astype 是如何把 np.uint8 是如何转成 np.float32

在 NumPy 中,使用 astype 函数可以将数组的数据类型转换为指定的类型。具体地说,将 np.uint8 类型的数组转换为 np.float32 类型的数组,可以使用以下代码:


import numpy as np

uint8_array = np.array([0, 128, 255], dtype=np.uint8)
float32_array = uint8_array.astype(np.float32) / 255.0

print(float32_array)

输出结果为:


[0.         0.5019608  1.        ]

在这里,我们首先创建一个 np.uint8 类型的数组 uint8_array,包含了三个元素:0、128 和 255。然后,我们使用 astype 函数将其转换为 np.float32 类型的数组 float32_array。为了将数据归一化到 [0, 1] 的范围内,我们还需要将 float32_array 中的每个元素除以 255。

Numpy:防止 Float16 数组转换为 Float32

Numpy:防止 Float16 数组转换为 Float32

如何解决Numpy:防止 Float16 数组转换为 Float32

我正在进行一些消耗大量内存的计算。我注意到我的一个函数(在下面复制)使我的计算机内存不足,并说它正在尝试使其成为 float64。我这里无法重现下面输出float 64的函数,但是这里的计算采用float16数组并输出float32,所以有点问题。

如何让 Python 坚持使用 float16(或者不使用 int 是否会更低?)

import numpy as np
xd1 = np.random.uniform(-1,10).astype(np.float16).reshape(5,2)
xd2 = np.random.uniform(-2,2)
def test_me(data1,data2):
    data1 = np.deg2rad(data1).astype(np.float16)
    data2 = np.deg2rad(data2).astype(np.float16)

    lat1 = data1[:,0]
    lng1 = data1[:,1]

    lat2 = data2[:,0]
    lng2 = data2[:,1]

    diff_lat = lat1[:,None] - lat2
    diff_lng = lng1[:,None] - lng2
    d = np.sin(diff_lat/2)**2 + np.cos(lat1[:,None])*np.cos(lat2) * np.sin(diff_lng/2)**2
    return 2 * 6371 * np.arcsin(np.sqrt(d)).astype(np.float16)
test_me(xd1,xd2)

Objective-C 中 Socket 常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte [])

Objective-C 中 Socket 常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte [])

最近项目中要用到 socket 通讯,由于涉及到组包问题,所以需要数据类型之间的来回转换,现在分享出来

如果想要请教 Socket 的问题请留言,我会随时回答的

1. int 类型转 16 进制 hexstring

[objc] view plain copy
  1. //int 转 16 进制  
  2. - (NSString *)hexFromInt:(NSInteger)val {  
  3.     return [NSString stringWithFormat:@"%X", val];  
  4. }  

 

2.16 进制转换为 NSData

[objc] view plain copy
  1. + (NSData *)dataFromHexString:(NSString *)hexString  
  2. {  
  3.     NSAssert((hexString.length > 0) && (hexString.length % 2 == 0), @"hexString.length mod 2 != 0");  
  4.     NSMutableData *data = [[NSMutableData alloc] init];  
  5.     for (NSUInteger i=0; i<hexString.length; i+=2) {  
  6.         NSRange tempRange = NSMakeRange(i, 2);  
  7.         NSString *tempStr = [hexString substringWithRange:tempRange];  
  8.         NSScanner *scanner = [NSScanner scannerWithString:tempStr];  
  9.         unsigned int tempIntValue;  
  10.         [scanner scanHexInt:&tempIntValue];  
  11.         [data appendBytes:&tempIntValue length:1];  
  12.     }  
  13.     return data;  
  14. }  



3.NSData 转 16 进制

[objc] view plain copy
  1. + (NSString *)hexStringFromData:(NSData *)data  
  2. {  
  3.     NSAssert(data.length > 0, @"data.length <= 0");  
  4.     NSMutableString *hexString = [[NSMutableString alloc] init];  
  5.     const Byte *bytes = data.bytes;  
  6.     for (NSUInteger i=0; i<data.length; i++) {  
  7.         Byte value = bytes[i];  
  8.         Byte high = (value & 0xf0) >> 4;  
  9.         Byte low = value & 0xf;  
  10.         [hexString appendFormat:@"%x%x", high, low];  
  11.     }//for  
  12.     return hexString;  
  13. }  


4.NSString 转 int 类型

[objc] view plain copy
  1. int a = [aStrinng  intValue];  


5.uint8 转 NSData (占两位)

[objc] view plain copy
  1. + (NSData *)byteFromUInt8:(uint8_t)val  
  2. {  
  3.     NSMutableData *valData = [[NSMutableData alloc] init];  
  4.       
  5.     unsigned char valChar[1];  
  6.     valChar[0] = 0xff & val;  
  7.     [valData appendBytes:valChar length:1];  
  8.       
  9.     return [self dataWithReverse:valData];  
  10. }  


6.uint16 转 NSData(占四位)

[objc] view plain copy
  1. + (NSData *)bytesFromUInt16:(uint16_t)val  
  2. {  
  3.     NSMutableData *valData = [[NSMutableData alloc] init];  
  4.       
  5.     unsigned char valChar[2];  
  6.     valChar[0] = 0xff & val;  
  7.     valChar[1] = (0xff00 & val) >> 8;  
  8.     [valData appendBytes:valChar length:2];  
  9.       
  10.     return [self dataWithReverse:valData];  
  11. }  


7.Uint32 转 NSData(占八位)

[objc] view plain copy
  1. + (NSData *)bytesFromUInt32:(uint32_t)val  
  2. {  
  3.     NSMutableData *valData = [[NSMutableData alloc] init];  
  4.       
  5.     unsigned char valChar[4];  
  6.     valChar[0] = 0xff & val;  
  7.     valChar[1] = (0xff00 & val) >> 8;  
  8.     valChar[2] = (0xff0000 & val) >> 16;  
  9.     valChar[3] = (0xff000000 & val) >> 24;  
  10.     [valData appendBytes:valChar length:4];  
  11.       
  12.     return [self dataWithReverse:valData];  
  13. }  

 

8.NSString 转 NSData

[objc] view plain copy
  1. NSData *data = [aString  dataUsingEncoding:NSUTF8StringEncoding];// 通过 utf-8 转为 data  


9.NSData 转 Uint8

[objc] view plain copy
  1. + (uint8_t)uint8FromBytes:(NSData *)fData  
  2. {  
  3.     NSAssert(fData.length == 1, @"uint8FromBytes: (data length != 1)");  
  4.     NSData *data = fData;  
  5.     uint8_t val = 0;  
  6.     [data getBytes:&val length:1];  
  7.     return val;  
  8. }  


10.NSData 转 Uint16

[objc] view plain copy
  1. + (uint16_t)uint16FromBytes:(NSData *)fData  
  2. {  
  3.     NSAssert(fData.length == 2, @"uint16FromBytes: (data length != 2)");  
  4.     NSData *data = [self dataWithReverse:fData];;  
  5.     uint16_t val0 = 0;  
  6.     uint16_t val1 = 0;  
  7.     [data getBytes:&val0 range:NSMakeRange(0, 1)];  
  8.     [data getBytes:&val1 range:NSMakeRange(1, 1)];  
  9.       
  10.     uint16_t dstVal = (val0 & 0xff) + ((val1 << 8) & 0xff00);  
  11.     return dstVal;  
  12. }  


11.NSData 转 Uint32

[objc] view plain copy
  1. + (uint32_t)uint32FromBytes:(NSData *)fData  
  2. {  
  3.     NSAssert(fData.length == 4, @"uint32FromBytes: (data length != 4)");  
  4.     NSData *data = [self dataWithReverse:fData];  
  5.       
  6.     uint32_t val0 = 0;  
  7.     uint32_t val1 = 0;  
  8.     uint32_t val2 = 0;  
  9.     uint32_t val3 = 0;  
  10.     [data getBytes:&val0 range:NSMakeRange(0, 1)];  
  11.     [data getBytes:&val1 range:NSMakeRange(1, 1)];  
  12.     [data getBytes:&val2 range:NSMakeRange(2, 1)];  
  13.     [data getBytes:&val3 range:NSMakeRange(3, 1)];  
  14.       
  15.     uint32_t dstVal = (val0 & 0xff) + ((val1 << 8) & 0xff00) + ((val2 << 16) & 0xff0000) + ((val3 << 24) & 0xff000000);  
  16.     return dstVal;  
  17. }  


12.NSData 转 Byte

[objc] view plain copy
  1. uint8_t byteArray[[data length]];  
  2.    
  3.  [data getBytes:&byteArray length:[data length]];  
  4.    
  5.   
  6.  for (int i = 0; i < [data length] ; i++ ) {  
  7.      Byte byte = byteArray[i];  
  8.      NSLog(@"--byte%x",byte);  
  9.  }  

 

13.NSData 的拼接

[objc] view plain copy
  1. [data1 appendData:data2];  

 

14.NSData 转 int (用 CFSwapInt32BigToHost)

 

[objc] view plain copy
  1. NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];  
  2. int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));  

 

以上可能会用到的反转字节序列代码

[objc] view plain copy
    1. + (NSData *)dataWithReverse:(NSData *)srcData  
    2. {  
    3.     //    NSMutableData *dstData = [[NSMutableData alloc] init];  
    4.     //    for (NSUInteger i=0; i<srcData.length; i++) {  
    5.     //        [dstData appendData:[srcData subdataWithRange:NSMakeRange(srcData.length-1-i, 1)]];  
    6.     //    }//for  
    7.       
    8.     NSUInteger byteCount = srcData.length;  
    9.     NSMutableData *dstData = [[NSMutableData alloc] initWithData:srcData];  
    10.     NSUInteger halfLength = byteCount / 2;  
    11.     for (NSUInteger i=0; i<halfLength; i++) {  
    12.         NSRange begin = NSMakeRange(i, 1);  
    13.         NSRange end = NSMakeRange(byteCount - i - 1, 1);  
    14.         NSData *beginData = [srcData subdataWithRange:begin];  
    15.         NSData *endData = [srcData subdataWithRange:end];  
    16.         [dstData replaceBytesInRange:begin withBytes:endData.bytes];  
    17.         [dstData replaceBytesInRange:end withBytes:beginData.bytes];  
    18.     }//for  
    19.       
    20.     return dstData;  

今天的关于如何将一个 uint32 Numpy 数组转换为 4 个 uint8 Numpy 数组来处理字节序怎么把numpy数组里的数都改成int型的分享已经结束,谢谢您的关注,如果想了解更多关于2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。、numpy 的 astype 是如何把 np.uint8 是如何转成 np.float32、Numpy:防止 Float16 数组转换为 Float32、Objective-C 中 Socket 常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte [])的相关知识,请在本站进行查询。

本文标签: