arrays boolean julia bitarray

arrays - ¿Cuál es la diferencia entre Array{Bool} y BitArray en Julia y cómo se relacionan?



boolean (1)

Estaba escribiendo una función para arrays booleanos 2d:

function foo(A::Array{Bool,2}) ... end

Evaluando y probando con

A = randbool(3,3) foo(A)

devoluciones

ERROR: ''foo'' has no method matching foo(::BitArray{2})

Obviamente, randbool() genera un BitArray , mientras que asumí que randbool() generaría un Array{Bool} .

¿Cómo se relacionan Array{Bool} y BitArray ? ¿Por qué ambos existen?

¿Puedo escribir foo() de tal manera que acepte ambos tipos de entrada usando un solo método (ya que no puedo ver una diferencia)?


Un Array{Bool} almacena cada valor true/false como un Bool , que se representa internamente como un UInt8 . Entonces, si su matriz tiene N elementos, tomará N bytes para almacenarla.

Un BitArray almacena cada valor true/false como un solo bit, con (conceptualmente) 8 de ellos empaquetados en un solo UInt8 . En consecuencia, solo se necesitan N/8 bytes para almacenar la matriz. Un BitArray también tiene métodos definidos que manejan todas las operaciones de manipulación de bits necesarias para usted.

Dependiendo de la operación, los BitArray veces son más lentos que el Array{Bool} y, a veces, más rápidos. Pero, en general, las diferencias de rendimiento son bastante pequeñas, por lo que tiene sentido usar BitArray a menos que tenga una razón específica para no hacerlo. Pero en general son bastante intercambiables.

Tenga en cuenta que ambos son subtipos de AbstractArray{Bool} :

julia> BitArray <: AbstractArray{Bool} true julia> Array{Bool} <: AbstractArray{Bool} true

Esto facilita la escritura de métodos genéricos que toman cualquiera de los dos.