diff --git a/library/PrimitiveExtras/PrimArray.hs b/library/PrimitiveExtras/PrimArray.hs
--- a/library/PrimitiveExtras/PrimArray.hs
+++ b/library/PrimitiveExtras/PrimArray.hs
@@ -11,6 +11,20 @@
 import qualified Data.ByteString.Short.Internal as ShortByteString
 
 
+{-|
+Construct from a primitive vector.
+In case the vector is not a slice, it is an /O(1)/ op.
+-}
+primitiveVector :: Prim a => PrimitiveVector.Vector a -> PrimArray a
+primitiveVector (PrimitiveVector.Vector offset length (ByteArray unliftedByteArray)) = let
+  primArray = PrimArray unliftedByteArray
+  in if offset == 0 && length == sizeofPrimArray primArray
+    then primArray
+    else runST $ do
+      ma <- newPrimArray length
+      copyPrimArray ma 0 primArray offset length
+      unsafeFreezePrimArray ma
+
 oneHot :: Prim a => Int {-^ Size -} -> Int {-^ Index -} -> a -> PrimArray a
 oneHot size index value =
   runST $ do
diff --git a/primitive-extras.cabal b/primitive-extras.cabal
--- a/primitive-extras.cabal
+++ b/primitive-extras.cabal
@@ -1,5 +1,5 @@
 name: primitive-extras
-version: 0.7.0.2
+version: 0.7.1
 category: Primitive
 synopsis: Extras for the "primitive" library
 homepage: https://github.com/metrix-ai/primitive-extras
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,6 +1,7 @@
 module Main where
 
-import Prelude
+import Prelude hiding (choose)
+import Data.Primitive
 import Test.QuickCheck.Instances
 import Test.Tasty
 import Test.Tasty.Runners
@@ -16,6 +17,7 @@
 import qualified PrimitiveExtras.SmallArray as SmallArray
 import qualified PrimitiveExtras.PrimArray as PrimArray
 import qualified Data.Serialize as Serialize
+import qualified Data.Vector.Primitive as PrimitiveVector
 
 
 main =
@@ -92,6 +94,21 @@
     ,
     testGroup "PrimArray" $
     [
+      testProperty "Construction from primitive vector" $ let
+        gen = do
+          offset <- choose (0, 2)
+          length <- choose (0, 100)
+          listSize <- let
+            minSize = offset + length
+            in choose (minSize, minSize + 100)
+          list :: [Int32] <- replicateM listSize arbitrary
+          return (list, offset, length)
+        in forAll gen $ \ (inputList, offset, length) -> let
+          !inputVec = PrimitiveVector.fromList inputList
+          !sliceVec = PrimitiveVector.slice offset length inputVec
+          !sliceList = PrimitiveVector.toList sliceVec
+          in sliceList === primArrayToList (PrimArray.primitiveVector sliceVec)
+      ,
       testProperty "Serializes well with as in memory" $ forAll (Gen.primArray Gen.element) $ \ primArray ->
       Right primArray ===
       Serialize.runGet (PrimArray.cerealGetAsInMemory Serialize.get)
